介绍 log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统,受Apache Software License保护,作者是Tad E. Smith。 log4cplus具有线程安全、灵活、以及多粒度控制的特点,通过将日志划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期。你可以选择将日志输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份等等。
安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 git clone --recurse-submodules https://github.com/log4cplus/log4cplus.git wget https://nchc.dl.sourceforge.net/project/log4cplus/log4cplus-stable/2.0.6/log4cplus-2.0.6.tar.xz ./configure --enable -static make make install
Git 地址:https://github.com/log4cplus/log4cplus
api地址:https://log4cplus.sourceforge.io/docs/api/2.0.x/
sourceforge地址:https://sourceforge.net/p/log4cplus/wiki/Home/#download
Filter 过滤器,过滤输出消息。
日志级别:
NOT_SET_LOG_LEVEL ( -1) 接受缺省的LogLevel,如果有父logger则继承它的LogLevel
ALL_LOG_LEVEL (0) 开放所有log信息输出
TRACE_LOG_LEVEL (0) 开放trace信息输出(即ALL_LOG_LEVEL)
DEBUG_LOG_LEVEL(10000) 开放debug信息输出
INFO_LOG_LEVEL (20000) 开放info信息输出
WARN_LOG_LEVEL (30000) 开放warning信息输出
ERROR_LOG_LEVEL(40000) 开放error信息输出
FATAL_LOG_LEVEL (50000) 开放fatal信息输出
OFF_LOG_LEVEL (60000) 关闭所有log信息输出
log4cplus支持编译时候和运行时刻利用日志级别进行输出过滤。编译时刻通过如下的预定义变量进行过滤:
1 2 3 4 5 6 #define LOG4CPLUS_DISABLE_FATAL #define LOG4CPLUS_DISABLE_WARN #define LOG4CPLUS_DISABLE_ERROR #define LOG4CPLUS_DISABLE_INFO #define LOG4CPLUS_DISABLE_DEBUG #define LOG4CPLUS_DISABLE_TRACE
Layout 布局器,控制输出消息的格式。
SimpleLayout 一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个”-“,如果初始化时没有将布局器附加到挂接器,则默认使用SimpleLayout。
PatternLayout 一种有词法分析功能的模式布局器,类似于C语言的printf()函数,能够对预定义的转换标识符(conversion specifiers)进行解析,转换成特定格式输出。
PatterLayout支持的转换标识符主要包括:
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 33 34 35 36 (1 )"%%" ,转义为%, 即,std ::string pattern = "%%" 时输出"%" 。 (2 )"%c" ,输出logger名称,比如std ::string pattern ="%c" 时输出: "test_logger.subtest" , 也可以控制logger名称的显示层次,比如"%c{1}" 时输出"test_logger" ,其中数字表示层次。 (3 )"%D" ,显示本地时间,当std ::string pattern ="%D" 时输出:"2004-10-16 18:55:45" ,%d显示标准时间,所以当std ::string pattern ="%d" 时输出 "2004-10-16 10:55:45" (因为北京时间位于东8 区,差8 个小时)。 可以通过%d{...}定义更详细的显示格式,比如%d{%H:%M:%s}表示要显示小时:分钟:秒。大括号中可显示的预定义标识符如下: %a -- 表示礼拜几,英文缩写形式,比如"Fri" %A -- 表示礼拜几,比如"Friday" %b -- 表示几月份,英文缩写形式,比如"Oct" %B -- 表示几月份,"October" %c -- 标准的日期+时间格式,如 "Sat Oct 16 18:56:19 2004" %d -- 表示今天是这个月的几号(1 -31 )"16" %H -- 表示当前时刻是几时(0 -23 ),如 "18" %I -- 表示当前时刻是几时(1 -12 ),如 "6" %j -- 表示今天是哪一天(1 -366 ),如 "290" %m -- 表示本月是哪一月(1 -12 ),如 "10" %M -- 表示当前时刻是哪一分钟(0 -59 ),如 "59" %p -- 表示现在是上午还是下午, AM or PM %q -- 表示当前时刻中毫秒部分(0 -999 ),如 "237" %Q -- 表示当前时刻中带小数的毫秒部分(0 -999.999 ),如 "430.732" %S -- 表示当前时刻的多少秒(0 -59 ),如 "32" %U -- 表示本周是今年的第几个礼拜,以周日为第一天开始计算(0 -53 ),如 "41" %w -- 表示礼拜几,(0 -6 , 礼拜天为0 ),如 "6" %W -- 表示本周是今年的第几个礼拜,以周一为第一天开始计算(0 -53 ),如 "41" %x -- 标准的日期格式,如 "10/16/04" %X -- 标准的时间格式,如 "19:02:34" %y -- 两位数的年份(0 -99 ),如 "04" %Y -- 四位数的年份,如 "2004" %Z -- 时区名,比如 "GMT" (4 )"%F" ,输出当前记录器所在的文件名称,比如std ::string pattern ="%F" 时输出: "main.cpp" 。 (5 )"%L" ,输出当前记录器所在的文件行号,比如std ::string pattern ="%L" 时输出: "51" (6 )"%l" ,输出当前记录器所在的文件名称和行号,比如std ::string pattern ="%L" 时输出"main.cpp:51" 。 (7 )"%m" ,输出原始信息,比如std ::string pattern ="%m" 时输出: "teststr" ,即上述代码中LOG4CPLUS_DEBUG的第二个参数,这种实现机制可以确保原始信息被嵌入到带格式的信息中。 (8 )"%n" ,换行符,没什么好解释的。 (9 )"%p" ,输出LogLevel,比如std ::string pattern ="%p" 时输出: "DEBUG" 。 (10 )"%t" ,输出记录器所在的线程ID,比如std ::string pattern ="%t" 时输出: "1075298944" 。 (11 )"%x" ,嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,NDC可以用对不同源的log 信息(同时地)交叉输出进行区分,关于NDC方面的详细介绍会在下文中提到。 (12 )格式对齐,比如std ::string pattern ="%-10m" 时表示左对齐,宽度是10 ,此时会输出"teststr " ,当然其它的控制字符也可以相同的方式来使用,比如"%-12d" ,"%-5p" 等等。
TTCCLayout 是在PatternLayout基础上发展的一种缺省的带格式输出的布局器, 其格式由时间,线程ID,Logger和NDC 组成(consists of time, thread, Logger and nested diagnostic context information, hence the name
Appender 输出器,与布局器和过滤器紧密配合,将特定格式的消息过滤后输出到所挂接的设备终端如屏幕,文件等等)。
ConsoleAppender 输出日志到控制台
FileAppender 输出日志到文件
RollingFileAppender RollingFileAppender类可以根据你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新文件中,除了定义每个记录文件的大小之外,你还要确定在RollingFileAppender类对象构造时最多需要多少个这样的记录文件(maxBackupIndex+1),当存储的文件数目超过maxBackupIndex+1时,会删除最早生成的文件,保证整个文件数目等于maxBackupIndex+1。然后继续记录。
DailyRollingFileAppender DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储,当超过该频度,后续log信息会另存到新文件中,这里的频度包括:MONTHLY(每月)、WEEKLY(每周)、DAILY(每日)、TWICE_DAILY(每两天)、HOURLY(每时)、MINUTELY(每分)
SocketAppender C/S方式的日志记录,用于支持重定日志向到远程服务器。
Logger 记录器,保存并跟踪对象日志信息变更的实体,当你需要对一个对象进行记录时,就需要生成一个logger。
Hierarchy 分类器,层次化的树型结构,用于对被记录信息的分类,层次中每一个节点维护一个logger的所有信息。
Loglevel 优先权,包括TRACE, DEBUG, INFO, WARNING, ERROR, FATAL。
配置
恶心点,只要打印日志,rootLogger 一定会被执行。。如果没必要,推荐只使用rootLogger
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 33 34 35 36 37 log4cplus.rootLogger =INFO,STDOUT,Rlog4cplus.logger.test =WARNlog4cplus.logger.test.log_1 =WARN log4cplus.logger.test.log_2 =WARN log4cplus.logger.test.log_3 =WARN, R3,R4 log4cplus.appender.STDOUT =log4cplus::ConsoleAppenderlog4cplus.appender.STDOUT.layout =log4cplus::PatternLayoutlog4cplus.appender.STDOUT.layout.ConversionPattern =%d{%m/%d/%y %H:%M:%S} [%l] %-5 p %c{2 } %%%x%% - %m [%l]@@@@@@@%nlog4cplus.appender.R =log4cplus::RollingFileAppenderlog4cplus.appender.R.File =output.loglog4cplus.appender.R.MaxFileSize =500 KBlog4cplus.appender.R.MaxBackupIndex =5 log4cplus.appender.R.layout =log4cplus::TTCCLayoutlog4cplus.appender.R3 =log4cplus::RollingFileAppenderlog4cplus.appender.R3.File =log_3.loglog4cplus.appender.R3.MaxFileSize =500 KBlog4cplus.appender.R3.MaxBackupIndex =5 log4cplus.appender.R3.layout =log4cplus::PatternLayoutlog4cplus.appender.R3.layout.ConversionPattern =%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5 p %c{2 } - %m%nlog4cplus.appender.R4 =log4cplus::DailyRollingFileAppenderlog4cplus.appender.R4.File =log_3.loglog4cplus.appender.R4.Schedule = DAILYlog4cplus.appender.R4.MaxFileSize =500 KBlog4cplus.appender.R4.MaxBackupIndex =5 log4cplus.appender.R4.Append = true log4cplus.appender.R4.ImmediateFlush = true log4cplus.appender.R4.layout =log4cplus::PatternLayoutlog4cplus.appender.R4.layout.ConversionPattern =%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5 p %c{2 } - %m%n
例子:hello world 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <log4cplus/logger.h> #include <log4cplus/loggingmacros.h> #include <log4cplus/configurator.h> #include <log4cplus/initializer.h> int main() { log4cplus::Initializer initializer; log4cplus::BasicConfigurator config; config.configure(); log4cplus::Logger logger = log4cplus::Logger::getInstance( LOG4CPLUS_TEXT("main" )); LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello, World!" )); return 0 ; }
参考
文章1 https://www.cnblogs.com/keepsimple/archive/2013/05/10/3071309.html