ACE服务端编程5:ACE日志输出和跟踪
服务器程序经常需要在命令行中显示错误消息、状态或者用来跟踪程序的执行路径,最简单的方法是使用printf。
ACE提供了更强大日志设施:
1、可以在编译时启用或禁用宏;
2、可以动态的启用或禁用宏;
3、支持日志严重级别;
4、支持日志重定向;
5、支持多线程安全和线程级配置;
使用ACE的日志相关功能,需要引入<ace/Log_Msg.h>头文件。
ACE日志输出
ACE提供了两个宏来支持日志输出:ACE_DEBUG、ACE_ERROR。
这两个宏的内部实现和行为都是一样,只是为了在语义上区分调试信息和错误信息。
在引入<ace/Log_Msg.h>头文件前添加以下定义可以关闭日志输出,ACE_DEBUG、ACE_ERROR将被替换为空语句:
#define ACE_NLOGGING 1
ACE_DEBUG、ACE_ERROR的使用示例:
ACE_DEBUG((LM_STARTUP, ACE_TEXT("Startup.\n"))); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("hook2: %d\n"), *paramp)); ACE_ERROR((LM_ERROR, ACE_TEXT("config file %s is not found.\n"), szConfigFile.c_str())
使用ACE_DEBUG、ACE_ERROR宏需要注意的地方是需要使用两对括号来包过参数。
第一个参数是严重级别,ACE可配置日志严重级别来显示或关闭该级别的日志输出:
LM_DEBUG、LM_ERROR、LM_INFO、LM_ALERT、LM_WARNING等,级别没有优先级之分,最常用的是LM_DEBUG、LM_ERROR。
第二个参数支持格式化字符串,常用的指令集:
%A:浮点数
%s:字符串
%d:十进制数
%M:严重级别
%N:文件名称
%P:进程ID
%t:线程ID
%D:当前时间
%I:缩进
ACE调用跟踪
ACE定义了ACE_TRACE宏用于跟踪函数的调用,具体说就是在其定义的地方产生输出,在退出其作用域时产生另一条输出。
ACE_TRACE的实现是被展开为一个栈上的对象,在其构造和析构函数中分别输出日志。
void foo() { ACE_TRACE(ACE_TEXT("foo\n")) int a = 0; int b = 0; int c = b; }
ACE_TRACE只接收单个字符串,不支持格式化字符串,输出的日志严重级别为LM_TRACE。
ACE_TRACE默认是禁用的,网上经常有朋友反映看不到ACE_TRACE的输出,而很多回答也是错的,单纯在项目中定义#define ACE_NTRACE 0也是无法起作用的。
必须在ace/config.h头文件中,在引用其他头文件前定义并且重新编译ACE库:
#define ACE_NTRACE 0
记录,为更好的自己!转载请注明出处!