C++编程之自定义日志类 ——log4cpp使用详解
log4cpp简介与安装
log4cpp是一个开源的C++日志管理库,可以通过它来记录程序运行过程中产生的各种信息。也可以进行再包装实现个人自定义的日志类。
log4cpp安装
- 下载:
wget https://nchc.dl.sourceforge.net/project/log4cpp/log4cpp-1.1.x%20%28new%29/log4cpp-1.1/log4cpp-1.1.3.tar.gz
- 解包
tar zxvf log4cpp-1.1.3.tar.gz
cd log4cpp
./configure --with-pthreads
./configure
make
make install
- 添加环境变量
vim /etc/profile.d/log4cpp.sh
在文件中添加:
LD_LIBRARY_PATH=:$LD_LIBRARY_PATH:/usr/local/lib export LD_LIBRARY_PATH
修改文件权限
chmod a+x /etc/profile.d/log4cpp.sh
ldconfig -v
安装好后, 在编译源码文件时要加上-llog4cpp -lpthread
来链接动态库
log4cpp简单介绍
log4cpp库中主要分为三大类:Category(种类)、Appender(附加目的地)和Layout(布局)。
- category类是日志记录的主要执行类,它负责写日志
- appender类用来指明目的地,即日志要写到什么地方去
- layout类指明日志输出的格式
应用时的大致流程:
- 定义一个layout类对象,确定输出日志信息的格式
- 定义一个appender类对象,确定日志输出到什么地方,然后把layout对象用setlayout方法绑定一下。
- 定义一个catergory对象,与appender类对象绑定
- 调用catergory对象进行写日志
简单示例
#include <iostream>
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/BasicLayout.hh>
int main()
{
//1. 初始化一个layout对象
log4cpp::Layout* layout = new log4cpp::BasicLayout();
// 2. 初始化一个appender 对象
log4cpp::Appender* appender = new log4cpp::FileAppender("FileAppender","./test_log4cpp1.log");
// 3. 把layout对象附着在appender对象上
appender->setLayout(layout);
// 4. 实例化一个category对象
log4cpp::Category& warn_log = log4cpp::Category::getInstance("mywarn");
// 5. 把appender对象附到category上
warn_log.setAppender(appender);
// 6. 设置category的优先级,低于此优先级的日志不被记录
warn_log.setPriority(log4cpp::Priority::WARN);
// 记录一些日志
warn_log.info("Program info which cannot be wirten");
warn_log.debug("This debug message will fail to write");
warn_log.alert("Alert info");
// 其他记录日志方式
warn_log.log(log4cpp::Priority::WARN, "This will be a logged warning");
log4cpp::Priority::PriorityLevel priority;
bool this_is_critical = true;
if(this_is_critical)
{
priority = log4cpp::Priority::CRIT;
}
else
{
priority = log4cpp::Priority::DEBUG;
}
warn_log.log(priority,"Importance depends on context");
// 清理所有资源
log4cpp::Category::shutdown();
return 0;
}
可以看到整套流程下来还是有点复杂的,可以在后续包装成一个自定义的日志类进行日志记录。
layout布局——日志输出格式
layout对象规定了日志输出的内容格式,创建后需要和appender对象绑定生效。
需要注意的是,一个布局对象只能绑定一个appender对象。
比较常用的布局有两种:log4cpp::BasicLayout
和log4cpp::PatternLayout
log4cpp::BasicLayout
log4cpp::BasicLayout是最简单的布局,输出时间戳ÿ