文章目录
- QT使用log4cpp日志库
- 1. 从官网下载log4cpp源码
- 2. 编译项目
- 3. 在QT中使用log4cpp
- 4. log4cpp
- 4.1. Category
- 4.2. Appender
- 4.3. Layout
- 4.4. Priority
- 4.5. 使用宏定义为日志加上文件名 函数名 行号等
 
 
QT使用log4cpp日志库
1. 从官网下载log4cpp源码
- log4cpp官方网址
  
- 下载后解压到文件夹如图,打开mscv10文件夹

- 双击打开msvc10.sln文件,vs版本较高打开后会提示升级项目点击确定就好
  
  
2. 编译项目
-  
  - 我使用的是64位的,一开始只有win32没有x64的选项,点击配置管理器添加x64
  
 
- 我使用的是64位的,一开始只有win32没有x64的选项,点击配置管理器添加x64
- 选择新建x64
  

- 我编译的是x64的release版本

-  
  - log4cpp处右键点击属性
 

-  
  - 在预处理器定义处增加HAVE_SNPRINTF
 
- 在预处理器定义处增加

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

- 在命令行点击编辑

-  
  - 改为以下命令
 
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
-  
  - 在.pro文件中包含log4cpp的头文件,链接库文件。如下图:
  
 
- 在.pro文件中包含log4cpp的头文件,链接库文件。如下图:
- 踩的一些坑:一开始老是提示无法解析的外部符号,后来发现是在.pro文件链接库时,最后忘记加\导致没链接上

- 加上\后运行报错LNK1112:模块计算机x86与目标计算机x64冲突,因为我一开始时直接编译的win32的改成第一步提到的x64再编译过就好了
  
- 关于log4cpp的比较关键的概念,整理自网络仅供参考
4. log4cpp
- 结构:日志类别(Category),日志追加器(Appender),日志布局(Layout),日志级别(Priority)
使用流程
- 创建一个Appender,指定包含的格式Layout
- 从系统中得到Category的根,将Appender添加到Category中
- 设置Category的优先级
- 记录日志
- 关闭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()




![[思维模式-19]:《复盘》-7- “积”篇 - 操作复盘- 如何做好复盘](https://img-blog.csdnimg.cn/df070e9ab6544365b887d01c211faee3.png)













