简介
我在写一个小工具时,出于一些调试目的,会使用一些cout输出一些关键变量和相关DEBUG信息,但是多线程的情况下,输出无序混杂,并且影响代码整体结构,后续还是需要删除,我受够了cout,于是决定使用一个正规的日志库作为我的调试观察之用。 以前在JAVA项目中,我一直使用log4j作为我的日志组件,所以在C++下面我使用了她的姐妹版,log4cplus。
log4cplus的编译安装
起初我使用sudo yum install log4cplus的命令安装,但是安装完后发现只有二进制文件,没有头文件,所以直接采用源码进行安装。 此处需要注意的是,最新版本的log4cplus需要C++11支持,如果您的环境不支持C++11,请选择较低版本,此处我采用的版本是log4cplus-1.1.1
安装办法
./configure
make
make install
可以在目录/usr/local/lib中看到liblog4cplus的二进制文件.
log4cplus使用
此处我对log4cplus的设置基于配置文件,并在代码中指定配置文件进行初始化。
log4cplus::PropertyConfigurator::doConfigure((LOG4CPLUS_TEXT("log.properties")));
log4cplus::Logger::getRoot().setLogLevel(log4cplus::ALL_LOG_LEVEL);
配置信息如下
log4cplus.rootLogger=INFO, console, file
log4cplus.appender.console = log4cplus::ConsoleAppender
log4cplus.appender.console.layout = log4cplus::PatternLayout
log4cplus.appender.console.layout.ConversionPattern = [%D{%m/%d/%y %H:%M:%S,%q} %-5p] - %m%n
log4cplus.appender.file = log4cplus::FileAppender
log4cplus.appender.file.File = /var/log/S3Sync.log
log4cplus.appender.file.MaxFileSize = 50M
log4cplus.appender.file.Append = true
log4cplus.appender.file.layout = log4cplus::PatternLayout
log4cplus.appender.file.layout.ConversionPattern = [%D{%m/%d/%y %H:%M:%S,%q} %-5p] - %m%n
在需要进行日志输出的地方,进行输出
Logger logger = log4cplus::Logger::getRoot();
LOG4CPLUS_ERROR(logger, "src Conn init failed. srcHost:"<< cfg->srcHost
<<" srcAccessKey: " << cfg->srcAccessKey
<<" srcSecretKey: " << cfg->srcSecretKey);
LOG4CPLUS_INFO(logger, "src Conn init succeed. srcHost:" << cfg->srcHost
<<" srcAccessKey: " << cfg->srcAccessKey
<<" srcSecretKey: " << cfg->srcSecretKey);
结束
我在配置文件中同时配置了stdout和file,所以程序在运行的时候既可以在控制台输出,同时也写入到文件中。
我在使用的时候,也只使用了root类型,在JAVA中,我们常用的方法是在每个类中都定义一个logger,只为该类服务。在C++中同样可以借鉴。