zoukankan      html  css  js  c++  java
  • 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.
    ")));
    
    ACE_DEBUG ((LM_DEBUG,
                  ACE_TEXT ("hook2: %d
    "),
                  *paramp));
    
    ACE_ERROR((LM_ERROR, ACE_TEXT("config file %s is not found.
    "), 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
    "))
        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
    

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

  • 相关阅读:
    使用CustomValidate自定义验证控件
    C#中金额的大小写转换
    Andriod出错之Unable to build: the file dx.jar was not loaded from the SDK folder!
    VC 编写的打字练习
    机房工作笔记Ping只有单向通
    web服务协同学习笔记(1)
    Dll 学习3 将MDI子窗口封装在DLL中
    机房工作学习文件共享
    Andriod出错之Failed to find an AVD compatible with target 'Android 2.2'
    Andriod出错之wrapper was not properly loaded first
  • 原文地址:https://www.cnblogs.com/ym123/p/4531429.html
Copyright © 2011-2022 走看看