现在的位置: 首页 > 综合 > 正文

ACE日志重定向(一)

2017年12月07日 ⁄ 综合 ⁄ 共 2499字 ⁄ 字号 评论关闭

前面提到的日志功能,只是简单的将日志打印出来,拥有了重定向功能后,这样的日志将会更强大。

今天暂时将相关重定向的代码贴上来。再次申请,vs2005下编译通过。

下次再进行改进,并更上所有测试程序。 

 

// LogManager.h: 
//
#include "ace/log_msg.h"
#include 
"ace/Object_Manager.h"
#include 
"aceSingleton.h"

#include
<fstream> 
using std::ofstream; 

#pragma once

#define ACE_NDEBUG 0
#define ACE_NTRACE 0


class LogManager
{
public:
    LogManager();
    
~LogManager();

    
void redirectToDaemon
        (
const ACE_TCHAR *prog_name = ACE_TEXT(""));
    
void redirectToSyslog
        (
const ACE_TCHAR *prog_name = ACE_TEXT(""));

    
void redirectToOStream (ACE_OSTREAM_TYPE *output);
    
void redirectToFile (const char *filename);
    
void redirectToStderr (void);
    ACE_Log_Msg_Callback 
* redirectToCallback
        (ACE_Log_Msg_Callback 
*callback);

private:

    std::ofstream        
*log_stream_;
    ACE_OSTREAM_TYPE    
*output_stream_;
}
;

typedef ACE_Singleton
<LogManager, ACE_Null_Mutex>
        LogManagerSingleton;
#define    Log_MANAGER LogManagerSingleton::instance();

LogManager::LogManager():log_stream_ (
0), output_stream_ (0)
{

}


LogManager::
~LogManager()
{
    
if (log_stream_)
        log_stream_
->close();

    delete log_stream_;
}


void LogManager::redirectToSyslog (const ACE_TCHAR *prog_name)
{
    ACE_LOG_MSG
->open (prog_name,ACE_Log_Msg::SYSLOG, prog_name);
}


void LogManager::redirectToDaemon(const ACE_TCHAR *prog_name)
{
    ACE_LOG_MSG
->open (prog_name, ACE_Log_Msg::LOGGER,
        ACE_DEFAULT_LOGGER_KEY);
}


void LogManager::redirectToOStream (ACE_OSTREAM_TYPE *output)
{
    output_stream_ 
= output;
    ACE_LOG_MSG
->msg_ostream (this->output_stream_);
    ACE_LOG_MSG
->clr_flags(
        ACE_Log_Msg::STDERR 
| ACE_Log_Msg::LOGGER);
    ACE_LOG_MSG
->set_flags (ACE_Log_Msg::OSTREAM);
}


void LogManager::redirectToFile (const char *filename)
{
    log_stream_ 
= new std::ofstream ();
    log_stream_
->open (filename, ios::out | ios::app);
    
this->redirectToOStream (log_stream_);
}


void LogManager::redirectToStderr (void)
{
    ACE_LOG_MSG
->clr_flags(
        ACE_Log_Msg::OSTREAM 
| ACE_Log_Msg::LOGGER);
    ACE_LOG_MSG
->set_flags (ACE_Log_Msg::STDERR);
}


ACE_Log_Msg_Callback
* 
LogManager::redirectToCallback(ACE_Log_Msg_Callback 
*callback)
{
    ACE_Log_Msg_Callback 
*previous = 
        ACE_LOG_MSG
->msg_callback (callback);
    
if (callback == 0)
    
{
        ACE_LOG_MSG
->clr_flags (ACE_Log_Msg::MSG_CALLBACK);
    }

    
else
    
{
        ACE_LOG_MSG
->set_flags (ACE_Log_Msg::MSG_CALLBACK);
    }


    
return previous;
}


/*
LogManager 类的主要局限是,它假定输出每次只去往一个地方。对于我们一些小的例子而言足够,但对于足够复杂的工程则远远不够,如何克服这个局限其实也不难,下次将做进一步的改进。
*/

抱歉!评论已关闭.