|
ACE具有强大的日志功能,可用在MFC及其控制台领域。
在MFC中若想利用ACE的日志功能,需要做如下准备:ACE::init();//将ACE动态库进行必要的初始化,在退出之时还需要执行如下代码:ACE::fini();//清除资源。
ACE 中,在代码中输出调试信息的有三个宏:
ACE_DEBUG // 输出自己的调试信息
ACE_ERROR // 输出警告和错误信息
ACE_TRACE // 在函数模块的开始设置后,在进入和退出该模块时,会输出调试信息
这三个宏的使用方法也很类似:
ACE_DEBUG ((severity, formatting-args));
ACE_ERROR ((severity, formatting-args));
- severity : 表示调试信息的等级.有效的severity 等级如下:
Severity Level
Meaning
LM_TRACE
Messages indicating function-calling sequence
LM_DEBUG
Debugging information
LM_INFO
Messages that contain information normally of use only when debugging a program
LM_NOTICE
Conditions that are not error conditions but that may require special handling
LM_WARNING
Warning messages
LM_ERROR
Error messages
LM_CRITICAL
Critical conditions, such as hard device errors
LM_ALERT
A condition that should be corrected immediately, such as a corrupted system database
LM_EMERGENCY
A panic condition, normally broadcast to all users
- formatting-args 参数,是类似于C 中 printf 函数输出的格式控制字段。
对于控制台程序,则要使用ACE的默认函数入口int ACE_TMAIN (int, ACE_TCHAR *[])来代替原来的入口函数int main(int,char*),当使用ACE的日志之前,最好先进行必要的日志重定向设置:ACE_Log_Msg::instance()->set_flags(),这个函数可以改变日志的重定向方向,参数有如下几个选项:
enum
{
/// Write messages to stderr.
STDERR = 1,
/// Write messages to the local client logger deamon.
LOGGER = 2,
/// Write messages to the ostream * stored in thread-specific
/// storage.
OSTREAM = 4,
/// Write messages to the callback object.
MSG_CALLBACK = 8,
/// Display messages in a verbose manner.
VERBOSE = 16,
/// Display messages in a less verbose manner (i.e., only print
/// information that can change between calls).
VERBOSE_LITE = 32,
/// Do not print messages at all (just leave in thread-specific
/// storage for later inspection).
SILENT = 64,
/// Write messages to the system's event log.
SYSLOG = 128,
/// Write messages to the user provided backend
CUSTOM = 256
};
程序默认是重定向到STDERR ,也就是说是重定向到调试窗口输出,这对于很多的应用存在着不便,因此这里重点讲一下MSG_CALLBACK ,它可以利用回调函数自定义日志功能,可以将输出重定向到你想要的任何环境中。
使用回调函数的日志功能需要在之前加如下代码:
ACE_Log_Msg::instance()->msg_callback( &m_mfc_logger );//重定向日志类
ACE_Log_Msg::instance()->set_flags( ACE_Log_Msg::MSG_CALLBACK );//设置重定向的类型为回调函数
这里再给出m_mfc_logger的定义
MFC_Log m_mfc_logger;
//MFC_Log.h
#ifndef MFC_LOG_H
#define MFC_LOG_H
#include "ace/Log_Msg_Callback.h"
class ACE_Log_Record;
class MFC_Log : public virtual ACE_Log_Msg_Callback
{
public:
/// Constructor
MFC_Log();
/// method called by ACE_Log_Msg to log an event
void log(ACE_Log_Record& log_record);
/// destructor
virtual ~MFC_Log();
};
#endif /* MFC_LOG_H */
// MFC_Log.cpp,v 1.1 2002/08/02 22:15:49 crodrigu Exp
// MFC_Log.cpp: implementation of the MFC_Log class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MFC_Log.h"
#include "ace/Log_Record.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
MFC_Log::MFC_Log()
{
}
void
MFC_Log::log(ACE_Log_Record& log_record)
{
unsigned long priority = log_record.type();
char Message[512];
ACE_OS::sprintf(Message,"%d.%03ld %s", log_record.time_stamp().sec(),
log_record.time_stamp().usec()/ 1000, log_record.msg_data());
::OutputDebugString(Message);
}
MFC_Log::~MFC_Log()
{
} |
|