日志是所有软件调试和定位问题的有效工具,拥有一个良好的日志系统可以帮助开发人员快速定位问题可能出在什么地方。一款好的日志系统可以根据使用者的意愿任意控制哪些日志可以输出、什么时候可以输出。同相也可以通过配置文件任意控制日志输出级别。
log4cplus是一款优秀的基于C/C++的开源日志库。log4cplus具有线程安全,不用但心在多线程状态下写日志问题;使用灵活,可通过配置文件设置日志级别下输出位置,还可以在程序运行时动态设置日志输出级别,随心所欲掌控日志的输出;以及多粒度控制的特点。通过将信息划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期; 可以选择将信息输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份。可以满足大部分开发者对日志系统需求,功能全面。
一、 linux下安装
在官方网站下载最新log4cplus源码,通过以下几步安装:
1、解压源码
tar xvzf log4cplus-x.x.x.tar.gz
2、进入解压目录安装
cd log4cplus-x.x.x
2.1、配置编译选项,可以configure跟--help参数查看所有配置选项帮助
./configure
2.2、编译并安装
make
make install
这里我采用缺省安装路径:/usr/local,可以通过--prefix=/install/path指定安装路径。
二、log4cplus内容简介与配置文件使用
log4cplus内容介绍
1. Logger对象
Logger对象具有层次结构,按名称区分,如下代码:
在log4cplus中logger的存储机制中,所有logger都通过一个层次化的结构来组织的,有一个Root级别的logger,可以通过以下方法获取:
Logger root = Logger::getRoot();
用户定义的logger都有一个名字与之对应,比如:
Logger test = Logger::getInstance("test");
可以定义该logger的子logger:
Logger subTest = Logger::getInstance("test.subtest");
注意Root级别的logger只有通过getRoot方法获取,Logger::getInstance("root")获得的是它的子对象而已。有了这些具有父子关系的logger之后可分别设置其LogLevel,比如:
root.setLogLevel( ... );
Test.setLogLevel( ... );
subTest.setLogLevel( ... );
2. 优先级
log4cplus优先级有低到高:
NOT_SET_LOG_LEVEL :接受缺省的LogLevel,如果有父logger则继承它的LogLevel
ALL_LOG_LEVEL :开放所有log信息输出
TRACE_LOG_LEVEL :开放trace信息输出(即ALL_LOG_LEVEL)
DEBUG_LOG_LEVEL :开放debug信息输出
INFO_LOG_LEVEL :开放info信息输出
WARN_LOG_LEVEL :开放warning信息输出
ERROR_LOG_LEVEL :开放error信息输出
FATAL_LOG_LEVEL :开放fatal信息输出
OFF_LOG_LEVEL :关闭所有log信息输出
3、以下是使用配置文件配置日志输出级别与输出位置实例:
//使用日志配置初始化log日志 #define INIT_LOG(filePath) log4cplus::PropertyConfigurator::doConfigure(filePath) //设置日志级别 #define SET_LOG_LEVEL(level) log4cplus::Logger::getRoot().setLogLevel(level) //定义日志输出 #define LOG_TRACE(logs) LOG4CPLUS_TRACE(log4cplus::Logger::getRoot(), logs) #define LOG_DEBUG(event) LOG4CPLUS_DEBUG(log4cplus::Logger::getRoot(), event) #define LOG_INFO(logs) LOG4CPLUS_INFO(log4cplus::Logger::getRoot(), logs) #define LOG_ERROR(logs) LOG4CPLUS_ERROR(log4cplus::Logger::getRoot(), logs)
log4cplus.rootLogger=TRACE, ALL_MSGS, DEBUG_MSGS, ERROR_MSGS ,TRACE_MSGS ,INFO_MSGS
#设置日志追加到文件尾
log4cplus.appender.DEBUG_MSGS=log4cplus::RollingFileAppender
#设置日志文件大小
log4cplus.appender.DEBUG_MSGS.MaxFileSize=100MB
#设置生成日志最大个数
log4cplus.appender.DEBUG_MSGS.MaxBackupIndex=10
#设置输出日志路径
log4cplus.appender.DEBUG_MSGS.File=/mnt/hgfs/2.linuxfile/8.object/systemdata/log/system.debug
log4cplus.appender.DEBUG_MSGS.layout=log4cplus::PatternLayout
#设置日志打印格式
log4cplus.appender.DEBUG_MSGS.layout.ConversionPattern=|%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.DEBUG_MSGS.filters.1=log4cplus::spi::LogLevelMatchFilter
#匹配相同日志级别,只有debug日志才输入到该文件中
log4cplus.appender.DEBUG_MSGS.filters.1.LogLevelToMatch=DEBUG
log4cplus.appender.DEBUG_MSGS.filters.1.AcceptOnMatch=true
log4cplus.appender.DEBUG_MSGS.filters.2=log4cplus::spi::DenyAllFilter
简单使用:
int main() { INIT_LOG(LOG_CONFIG_PATH); SET_LOG_LEVEL( log4cplus::ALL_LOG_LEVEL); SetSignal(); LOG_DEBUG("debug"); LOG_ERROR("error"); LOG_INFO("info"); LOG_TRACE("trace"); return 0; }