演示ACE_Log_Msg类的使用

来源:互联网 发布:金码出纳软件 编辑:程序博客网 时间:2024/05/08 13:12
//
/*
 *  演示ACE_Log_Msg类的使用
 *
 *    ACE日志系统几乎提供了应用程序所需要的全部日志功能,尤其对于
 *  ACE_Log_Msg_Backend提供了必要的接口将日志分门别类(logger_key)
 *  的输出到不同设备(如:屏幕、文件、日志服务器Deamon等),这对于同一
 *  模块中对不同逻辑(如:内存,线程等资源的使用)的监测提供了便利。
 *
 *  理解TRACE(ACE_TRACE)和调试(ACE_DEBUG)信息的含义:
 *      -ACE_TRACE
 *          跟踪函数的调用堆栈(通过tab缩进表示)——观察对象的生命
 *          周期等非常有用。
 *          通过在编译器中加入或删除ACE_NTRACE=0预定义宏灵活控制信息
 *          输出与否。
 *
 *      -ACE_DEBUG
 *          主要用于监测程序逻辑数据的正确性。
 *
 *  !!!注意!!!
 *      不要在ACE_Log_Msg_Callback或ACE_Log_Msg_Backend的子类中调用
 *      ACE_TRACE和ACE_DEBUG等宏输出信息。
 
*/


#include 
"ace/OS.h"
#include 
"ace/Log_Msg.h"
#include 
"ace/Log_Record.h"
#include 
"ace/Log_Msg_Callback.h"
#include 
"ace/Log_Msg_Backend.h"

#include 
<string>
#include 
<fstream>

//*******************************************************************************
const ACE_TCHAR *prog_name = ACE_TEXT("ACE_Log_Msg_test");
const ACE_TCHAR *logger_key = ACE_TEXT("ACE_Log_Msg_test*");

//*******************************************************************************
class My_Log_Msg_Callback : public ACE_Log_Msg_Callback
{
    ACE_Log_Msg_Callback 
*oldcallback_;    
public:
    
~My_Log_Msg_Callback()
    
{
        ACE_OS::printf(ACE_TEXT(
"My_Log_Msg_Callback::~My_Log_Msg_Callback() "));
        
// !!!注意销毁后清理ACE_Log_Msg相应状态,ACE_Log_Msg作为
        
// Singleton形式存在,系统退出时ACE_Object_Manager清理它。
        
// 这里假设My_Log_Msg_Callback实例生命周期短于ACE_Log_Msg实例,
        
// 并非所有情况都是正确的
        ACE_LOG_MSG->clr_flags(ACE_Log_Msg::MSG_CALLBACK);
        ACE_LOG_MSG
->msg_callback(oldcallback_);
    }


    
void oldcallback(const ACE_Log_Msg_Callback *backend)
    
{
        oldcallback_ 
= const_cast<ACE_Log_Msg_Callback *>(backend);
    }

    
virtual void log (ACE_Log_Record &log_record)
    
{
        ACE_OS::printf(
"[Log_Msg_Callback]%s", log_record.msg_data());
    }

}
;

class My_Log_Msg_Backend : public ACE_Log_Msg_Backend
{
    ACE_Log_Msg_Backend 
*oldbackend_;
public:
    My_Log_Msg_Backend() : oldbackend_(
0{}
    
~My_Log_Msg_Backend()
    
{
        ACE_OS::printf(ACE_TEXT(
"My_Log_Msg_Backend::~My_Log_Msg_Backend() "));
        
// !!!注意销毁后清理ACE_Log_Msg相应状态,ACE_Log_Msg作为
        
// Singleton形式存在,系统退出时ACE_Object_Manager清理它。
        
// 这里假设My_Log_Msg_Backend实例生命周期短于ACE_Log_Msg实例,
        
// 并非所有情况都是正确的
        ACE_LOG_MSG->clr_flags(ACE_Log_Msg::CUSTOM);
        ACE_LOG_MSG
->msg_backend(oldbackend_);
    }

    
void oldbackend(const ACE_Log_Msg_Backend *backend)
    
{
        oldbackend_ 
= const_cast<ACE_Log_Msg_Backend *>(backend);
    }

    
virtual int open (const ACE_TCHAR *logger_key)
    
{
        ACE_OS::printf(
"My_Log_Msg_Backend::open() logger_key[%s] ", logger_key);
        
return 0;
    }


    
virtual int reset (void)
    
{
        
return 0;
    }


    
virtual int close (void)
    
{
        
return 0;
    }


    
virtual int log (ACE_Log_Record &log_record)
    
{
        ACE_OS::printf(
"[Log_Msg_Backend]%s", log_record.msg_data());

        
return 0;
    }

}
;

//*******************************************************************************
void foo()
{
    ACE_TRACE(ACE_TEXT(
"foo()"));
    ACE_DEBUG((LM_DEBUG, ACE_TEXT(
"foo() ")));
}


//*******************************************************************************
int ACE_TMAIN(int argc, ACE_TCHAR *argv[])
{
    std::ofstream os((std::
string(argv[0]) + ".log").c_str());
    ACE_LOG_MSG
->msg_ostream(&os, 0);
    My_Log_Msg_Callback lmc;
    ACE_Log_Msg_Callback 
*oldcallback = ACE_LOG_MSG->msg_callback(&lmc);
    lmc.oldcallback(oldcallback);
    My_Log_Msg_Backend lmb;     
/// ACE_Log_Msg::CUSTOM
    ACE_Log_Msg_Backend *oldbackend = ACE_LOG_MSG->msg_backend(&lmb);
    lmb.oldbackend(oldbackend);

    ACE_LOG_MSG
->open(prog_name, 
                      ACE_Log_Msg::STDERR 
|
                      ACE_Log_Msg::OSTREAM 
| 
                      ACE_Log_Msg::MSG_CALLBACK 
|
                      ACE_Log_Msg::CUSTOM,
                      logger_key);
    
    ACE_TRACE(ACE_TEXT(
"main()"));

    ACE_DEBUG((LM_DEBUG, ACE_TEXT(
"main() ")));
    
    foo();

    
return 0;
}

//