Log4cpp的配置和使用

下载log4cpp后,按照老三步进行安装,头文件安装到/usr/local/include/log4cpp,库文件在/usr/local/lib。如果在ARM平台,安装为

1
2
3
./configure --build=arm-linux
make
sudo make install

在CMakeList里写好调用后,编译,结果报错:

1
2
3
4
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_key_create'
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_getspecific'
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_key_delete'
//usr/local/lib/liblog4cpp.so: undefined reference to `pthread_setspecific'

这是不识别pthread,需要再链接pthread,target_link_libraries(${PROJECT_NAME} -llog4cpp -pthread),这样就正常了

我的日志配置文件是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# DEBUG是指定rootCategory的log级别门槛
# TESTAppender是输出到日志文件
# 如果有console,日志会在CGI,IDE输出和Linux终端中输出
log4cpp.rootCategory=DEBUG,TESTAppender

# -------定义console属性------- #

# consoleAppender类型:控制台输出
# 控制台输出的log输出的格式是:[%p] %d{%H:%M:%S.%l} (%c): %m%n
log4cpp.appender.console=ConsoleAppender
log4cpp.appender.console.layout=PatternLayout
log4cpp.appender.console.layout.ConversionPattern=[%p] %d{%H:%M:%S.%l} (%c): %m%n

# -------定义TESTAppender的属性-------
# RollingFileAppender类型:输出到回卷文件,即文件到达某个大小的时候产生一个新的文件
log4cpp.appender.TESTAppender=RollingFileAppender

#当日志文件到达maxFileSize大小时,将会自动滚动,这里是100K
log4cpp.appender.TESTAppender.maxFileSize=100000000

#maxBackupIndex指定可以产生的滚动文件的最大数
log4cpp.appender.TESTAppender.maxBackupIndex=10

# 日志信息输出到的文件路径
log4cpp.appender.TESTAppender.fileName=/home/user/log/package.log

# PatternLayout 表示可以灵活指定布局模式
log4cpp.appender.TESTAppender.layout=PatternLayout

#append=true 信息追加到上面指定的日志文件中,false表示将信息覆盖指定文件内容
log4cpp.appender.TESTAppender.append=true
log4cpp.appender.TESTAppender.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S.%l}-%p]: %m%n

log4cpp的模式设置,我常用的是 [%d{%m-%d %H:%M:%S.%l}-%p]: %m%n,日志的形式: [03-08 13:48:07.876-INFO]: this is log

默认是%m%n

  • %%%%: a single percent sign
  • %c: the category
  • %d: the date
  • %p: 优先级
  • %r: milliseconds since this layout was created.
  • %R: seconds since Jan 1, 1970
  • %l: 毫秒
  • %m the message
  • %n: the platform specific line separator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <log4cpp/Category.hh>
#include <log4cpp/PropertyConfigurator.hh>


try
{
log4cpp::PropertyConfigurator::configure(config_base_path+"/log.conf");
}
catch (log4cpp::ConfigureFailure& f)
{
std::cout << "Configure Problem: " << f.what() << std::endl;
}

log4cpp::Category& log = log4cpp::Category::getRoot(); //类Category的静态函数进行初始化
log.info("Hello log, %s", "abc");
log.info("[%s -> %s -> %d] Test option",__FILE__,__FUNCTION__,__LINE__);

如果配置文件路径不存在,会报错: Configure Problem: File /home/user/Document/test.conf does not exist
但是程序还可以继续向下运行,也就是不会受日志的问题而影响,这正是我们需要的。

如果将log作为成员变量,这样写

1
2
3
4
log4cpp::Category& log;  // 成员变量

MyClass::MyClass()
:log(log4cpp::Category::getRoot() )

不指定配置文件仍能通过编译,但是不要这样做。 Log4cpp不存在获得配置文件或日志目录的接口

运行结果生成了日志文件,内容和终端输出都是:

1
2
[06-26 06:14:21.658 - INFO]: Hello log, abc
[06-26 06:14:21.659 - INFO]: [/home/user/QtProjects/TestLog4cpp/main.cpp -> main -> 22] Test option

log4cpp::Category::shutdown();会关闭所有的appenders,这一句只能在程序的最后使用,我曾经在某个类的析构函数里调用了它,但这个类在一个函数里使用,所以这个类对象是局部变量,函数结束后就执行了shutdown(),但主函数尚未结束,导致主函数后面的日志都不能显示了

另外还有一个 spdlog

spdlog 的配置使用