服务器程序经常需要在命令行中显示错误消息、状态或者用来跟踪程序的执行路径,最简单的方法是使用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 = ;
int b = ;
int c = b;
}

ACE_TRACE只接收单个字符串,不支持格式化字符串,输出的日志严重级别为LM_TRACE。

ACE_TRACE默认是禁用的,网上经常有朋友反映看不到ACE_TRACE的输出,而很多回答也是错的,单纯在项目中定义#define ACE_NTRACE 0也是无法起作用的。

必须在ace/config.h头文件中,在引用其他头文件前定义并且重新编译ACE库:

#define ACE_NTRACE 0

记录,为更好的自己!转载请注明出处!

ACE服务端编程5:ACE日志输出和跟踪的更多相关文章

  1. ACE服务端编程3:ACE跨平台之分配堆内存

    ACE服务端编程系列的第三篇,探究ACE解决不同编译器之间分配堆内存的差异. 在ACE的官方示例中会看到大量的ACE_NEW_RETURN,ACE_NEW这样的宏,这是ACE为了消除不同编译器编译的代 ...

  2. ACE服务端编程4:ACE跨平台之运行时初始化和关闭

    参考APG里的说法:平台差异及不兼容性的一个特别的方面,是对象的运行时初始化和程序关闭时这些对象的相应析构. ACE为了明确管理对象的清理,定义了ACE_Object_Manager类,这个类不仅涉及 ...

  3. ACE服务端编程2:ACE跨平台之数据类型和宽字符

    ACE网络库的主要优势之一就是跨平台,ACE提供了操作系统API和编译器级别的跨平台解决方法,使开发人员不用再去关心操作系统和编译器的差异,但因此也带来了ACE的复杂性. ACE网络库的组织结构主要分 ...

  4. ACE服务端编程1:使用VS2010编译ACE6.0及从ACE5.6升级的注意事项

    ACE是一个跨平台的用于并发通信的C++框架,项目开始时使用的是ACE 5.6发布版,目前最新的ACE版本是6.3.0. 网上一直有一种黑ACE的氛围,主要黑点在于ACE的复杂和作者的背景,结合实际应 ...

  5. Photon Server 服务端编程

    Photon Server 和 Unity3D 数据交互: Photon Server 服务端编程 Unity3D 客户端编程 VS2017 之 MYSQL实体数据模 一:Photon Server的 ...

  6. Linux多线程服务端编程一些总结

    能接触这本书是因为上一个项目是用c++开发基于Linux的消息服务器,公司没有使用第三方的网络库,卷起袖子就开撸了.个人因为从业经验较短,主 要负责的是业务方面的编码.本着兴趣自己找了这本书.拿到书就 ...

  7. 《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市

    <Linux 多线程服务端编程:使用 muduo C++ 网络库> 电子版已在京东和亚马逊上市销售. 京东购买地址:http://e.jd.com/30149978.html 亚马逊Kin ...

  8. 《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册

    <Linux多线程服务端编程:使用muduo C++网络库>这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错 ...

  9. 《Linux多线程服务端编程》笔记——多线程服务器的适用场合

    如果要在一台多核机器上提供一种服务或执行一个任务,可用的模式有 运行一个单线程的进程 运行一个多线程的进程 运行多个单线程的进程 运行多个多线程的进程 这些模式之间的比较已经是老生常谈,简单地总结 模 ...

随机推荐

  1. Javascript 初学笔记

    变量作用域 自 ES2015 起,JS 引入let 和 const 关键词定义变量的块作用域(Block Scope). var 仅支持全局作用域(Global Scope)和函数作用域(Functi ...

  2. 数据库MySql在python中的使用

    随着需要存储数据的结构不断复杂化,使用数据库来存储数据是一个必须面临的问题.那么应该如何在python中使用数据库?下面就在本篇博客中介绍一下在python中使用mysql. 首先,本博客已经假定阅读 ...

  3. PHP中的变量名,函数名,类名是区分大小写的吗

    在PHP中,自定义的函数名,类名,以及内置的函数,关键字是不区分大小写的,比如: class,Class,CLASS,while,While,ECHO,echo,NULL,Null 都是一样的. 但是 ...

  4. 【Alpha】阶段第一次Scrum Meeting

    [Alpha]阶段第一次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 后端接口开发 测试接口,修正bug 赵智源 撰写测试方案书 部署实际任务和编写测试样例 ...

  5. 【dp】New Keyboard

    http://codeforces.com/gym/101397 B dp[i][j][k]: i为前一个行动的状态,0-switch.1-type,j为当前状态layout的编号,k 是已键入的字符 ...

  6. jsp取不到值栈的值

    是否页面用的重定向? <result name="addsuccess"  type="redirect"> ? 去掉type="redi ...

  7. SGU 199 Beautiful People 二维最长递增子序列

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20885 题意: 求二维最长严格递增子序列. 题解: O(n^2) ...

  8. lintcode-107-单词切分

    107-单词切分 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词. 样例 给出 s = "lintcode" dict = [" ...

  9. 继承&成员函数&覆盖

    //成员函数. /* 当子父类中出现成员函数一模一样的情况,会运行子类的函数. 这种现象,称为覆盖操作.这时函数在子父类中的特性. 函数两个特性: 1,重载.同一个类中.overload 2,覆盖.子 ...

  10. TeamCity编译执行selenium上传窗口脚本缺陷

    2015-07-04 18:05 编写本文 TeamCity编译selenium脚本,对于上传窗口处理只支持sendKeys的使用,不支持模拟人为按下Enter键和使用autoIt等操作,即使本地调试 ...