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