QT使用log4cpp日志库

QT使用log4cpp日志库

1. 从官网下载log4cpp源码

在这里插入图片描述

  • 双击打开msvc10.sln文件,vs版本较高打开后会提示升级项目点击确定就好
    在这里插入图片描述
    在这里插入图片描述

2. 编译项目

    1. 我使用的是64位的,一开始只有win32没有x64的选项,点击配置管理器添加x64
      在这里插入图片描述
  • 选择新建x64
    在这里插入图片描述

在这里插入图片描述

  • 我编译的是x64的release版本

在这里插入图片描述

    1. log4cpp处右键点击属性

在这里插入图片描述

    1. 在预处理器定义处增加HAVE_SNPRINTF

在这里插入图片描述

    1. 找到log4cpp下的NTEventLogCategories.mc右键属性

在这里插入图片描述

  • 在命令行点击编辑

在这里插入图片描述

    1. 改为以下命令
if not exist $(OutDir) md $(OutDir)
mc.exe -h $(OutDir) -r $(OutDir) $(ProjectDir)..\%(Filename).mc
RC.exe -r -fo $(OutDir)%(Filename).res $(OutDir)%(Filename).rc
link.exe /MACHINE:IX86 -dll -noentry -out:$(OutDir)NTEventLogAppender.dll $(OutDir)%(Filename).res

在这里插入图片描述

  • 倘若需编译log4cppLIB则需对log4cppLIB也执行以上2-5步操作
  • 如需编译整个工程还需对testDailyRollingFileAppender下的testDailyRollingFileAppender.cpp的第43行增加一个空格,即由下图的1改为2

在这里插入图片描述

在这里插入图片描述

  • 在log4cpp处右键生成

在这里插入图片描述

  • 编译成功

在这里插入图片描述

在这里插入图片描述

  • 对log4cpp项目编译后生成的lib和dll文件在log4cpp\msvc10\x64\Release文件夹下
    在这里插入图片描述

3. 在QT中使用log4cpp

    1. 在.pro文件中包含log4cpp的头文件,链接库文件。如下图:
      在这里插入图片描述

  • 踩的一些坑:一开始老是提示无法解析的外部符号,后来发现是在.pro文件链接库时,最后忘记加\导致没链接上

在这里插入图片描述

  • 加上\后运行报错LNK1112:模块计算机x86与目标计算机x64冲突,因为我一开始时直接编译的win32的改成第一步提到的x64再编译过就好了
    在这里插入图片描述

  • 关于log4cpp的比较关键的概念,整理自网络仅供参考

4. log4cpp

  • 结构:日志类别(Category),日志追加器(Appender),日志布局(Layout),日志级别(Priority)

使用流程

  1. 创建一个Appender,指定包含的格式Layout
  2. 从系统中得到Category的根,将Appender添加到Category中
  3. 设置Category的优先级
  4. 记录日志
  5. 关闭Category

4.1. Category

  • 日志输出主体类:设置类别优先级,低于此优先级的类都不再输出 ,每个应用程序都有一个root分类,他分类都是root分类的子分类,子分类的输出同时会输出到父分类中。
  • 日志的常用优先级:DEBUG < INFO < WARN < ERROR < FATAL
// 根分类root 大多数情况下一个应用程序只需要一个日志种类
log4cpp::Category& root = log4cpp::Category::getRoot();
// 子分类subCat1 不同的子categor用于不同的场合
log4cpp::Category& sub1 = log4cpp::Category::getInstance("sub1");

4.2. Appender

  • 确定日志输出行为:
    • 输出位置:有些Appender类没有设置互斥,不要使用一个Appender加载到多个Category中
    • 输出方式:
      • OstreamAppender:输出到输出流中(输出到控制台上)
      • FileAppender:输出到文件中
      • RollingFileAppender:输出到文件中并且能够设置文件最大超过多少时生成新文件
      • DailyRollingFileAppender:每天生成一个新文件
      • NTEventLogAppender:将日志输出到Windows事件日志中去
      • StringQueueAppender:内存队列
      • SyslogAppender:本地syslog
      • Win32DebugAppender:发送到缺省系统调试器
      • IdsaAppender:发送到IDS
      • RemoteSyslogAppender:输出到远程syslog服务器

4.3. Layout

  • BasicLayout
  • SimpleLayout 提供的成型的简单日志风格
  • PatternLayout 对日志做格式输出
  • layout是加载到Appender中去的

4.4. Priority

  • 日志级别
typedef enum
{
    
    
    EMERG  = 0,     // emergency
    FATAL  = 0,     // fatal
    ALERT  = 100,   // alert
    CRIT   = 200,   // critical
    ERROR  = 300,   // error
    WARN   = 400,   // wanning
    NOTICE = 500,   // notice
    INFO   = 600,   // infomation
    DEBUG  = 700,   // debug
    NOTSET = 800   
} PriorityLevel;

4.5. 使用宏定义为日志加上文件名 函数名 行号等

#define suffix1(msg) std::string(msg).append(" [")\
    .append(__FILE__).append("] [")\
    .append(__FUNCTION__).append("] [")\
    .append(std::to_string(__LINE__)).append("] ").c_str()

猜你喜欢

转载自blog.csdn.net/m0_68312479/article/details/128486272