在 Windows 下使用
ACE,对于非控制台程序而言,由于没有 stderr
输出可以查看,在调试的时候,无论是把日志输出到文件,或是输出到系统事件查看器,使用起来都不是那么方便。其实,利用
ACE 强大的日志重定向功能,把日志输出到调试器的
Output Window (或者叫 Trace Window) 是非常容易的。
首先,我们定义一个 Callback
类,用于拦截 ACE
日志设施的输出:
#include <ace/Log_Msg_Callback.h>
#include <ace/Log_Record.h>
class Callback : public ACE_Log_Msg_Callback
{
public:
void setVerbose(unsigned long verbose);
void log(ACE_Log_Record &log_record);
private:
unsigned long _verbose;
};
void Callback::setVerbose(unsigned long verbose)
{
_verbose = verbose;
}
void Callback::log(ACE_Log_Record &log_record)
{
char buffer[ACE_Log_Record::MAXVERBOSELOGMSGLEN];
log_record.format_msg(ACE_TEXT(""), _verbose, buffer);
OutputDebugString(buffer);
}
然后将日志重定向到 Callback 对象的实例即可:
#include <ace/Log_Msg.h>
...
Callback callback;
ACE_LOG_MSG->msg_callback(&callback);
ACE_LOG_MSG->set_flags(ACE_Log_Msg::MSG_CALLBACK);
...
ACE_LOG_MSG->clr_flags(ACE_Log_Msg::MSG_CALLBACK);
警告!在程序退出之前,务必将指向 Callbak
的日志设施关闭,否则当 callback
对象析构之后,如果还有别的日志需要输出的话,这个无效的指针将会导致你的程序整个崩溃掉。