演示ACE_Log_Msg类的使用

//
/*
 *  演示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;
}

//
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值