找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5122|回复: 2

ACE学习系列(二)日志重定向

[复制链接]
发表于 2008-3-31 15:20:07 | 显示全部楼层 |阅读模式
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()
{
}
发表于 2008-5-8 15:49:06 | 显示全部楼层
Hi,
    看了您的帖子,我自己也看了看,还是不明白,到底如何修改下面的三个宏才可以让ACE自带的调试信息输出,我现在的情况是ACE_DEBUG ,ACE_ERROR,ACE_TRACE 三个函数都无法使用,如果在vxworks下又该怎么办了?ACE下面有的ACE_TRACE语句已经被注释掉了,如何才能恢复
请指点
发表于 2008-5-8 22:07:55 | 显示全部楼层
在windows上面能有输出吗?
我没用过vxworks,不是很了解上面的情况。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 22:04 , Processed in 0.016091 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表