在 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 对象析构之后,如果还有别的日志需要输出的话,这个无效的指针将会导致你的程序整个崩溃掉。