文章目录
- 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
:本地syslogWin32DebugAppender
:发送到缺省系统调试器IdsaAppender
:发送到IDSRemoteSyslogAppender
:输出到远程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()