Log需求
- 统一的 、信息齐全的log
- 可以方便配置Log的打印等级
- 可以更加细粒度的控制各个模块的Log等级
- 可以将Log输出到希望的地方。
…
log4cplus基本模块各解决了什么问题
logger模块·
基本逻辑
- 一个应用程序可以使用多个Logger 。
- Logger是我们使用log4cplus打印LOG的句柄。
- Logger使用setLogger接口设置打印LOG的最低等级。
- NOT_SET :接受缺省的LogLevel,如果有父logger则继承它的LogLevel
- ALL :开放所有log信息输出
- TRACE :开放trace信息输出(即ALL_LOG_LEVEL)
- DEBUG :开放debug信息输出
- INFO :开放info信息输出
- WARN :开放warning信息输出
- ERROR :开放error信息输出
- FATAL :开放fatal信息输出
- OFF:关闭所有log信息输出
- 两个Logger可以利用名字形成父子关系, 进而多个Logger新成Logger 树 或者 Logger 森林。
// 创建一个main logger 节点
log4cplus::Logger mainLogger = log4cplus::Logger::getInstance("main");
// 创建module1的logger节点,从属于main logger
log4cplus::Logger module1Logger = log4cplus::Logger::getInstance("main.module1");
- 除非特别设置,否则子节点继承父节点的各种配置信息。
- 子节点继承父节点的所有appender。
appender 模块
基本逻辑
- 一个Logger可以拥有多个Appender。
- Appender决定了LOG的输出方向。
- ConsoleAppender 输出到终端。
- FileAppender输出到文件。
- FileAppender 覆盖写文件。
- RollingFileAppender 追加写文件。
- DailyRollingFileAppender每日切换追加写文件。
- SocketAppender 输出到socket。
- SyslogAppender 输出到syslog。
Filter 模块
- 一个Appender 可以有多个Filter, 在配置文件中过滤条件处理机制类似于IPTABLE的Responsibility chain,(即先deny、再allow)不过执行顺序刚好相反,后写的条件会被先执行,比如:
# 先DenyAll 在Filter TRACE
log4cplus.appender.TRACE_LOG.filters.1=log4cplus::spi::LogLevelMatchFilter
log4cplus.appender.TRACE_LOG.filters.1.LogLevelToMatch=TRACE
log4cplus.appender.TRACE_LOG.filters.1.AcceptOnMatch=true
log4cplus.appender.TRACE_LOG.filters.2=log4cplus::spi::DenyAllFilter
- 支持不同的Filter模式
- LogLevelMatchFilter,过滤条件包括LogLevelToMatch和AcceptOnMatch,只有当log信息的LogLevel值与LogLevelToMatch相同,且AcceptOnMatch为true时才会匹配。
- LogLevelRangeFilter,过滤条件包括LogLevelMin、LogLevelMax和AcceptOnMatch,只有当log信息的LogLevel在LogLevelMin、LogLevelMax之间同时AcceptOnMatch为true时才会匹配。
- StringMatchFilter,过滤条件包括StringToMatch和AcceptOnMatch,只有当log信息的message值与StringToMatch相同,且AcceptOnMatch为true时会匹配。
Layout模块
- 每个appender有且仅有一个layout。
- 支持一下3种layout :
- SimpleLayout 是一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个”-“。
- TTCCLayout 其格式由时间,线程ID,Logger名字和NDC 组成。
- NDC (Nested Diagnostic Context) 利用linux的线程私有数据实现。
#include <log4cplus/ndc.h>
......
NDC& ndc = log4cplus::getNDC();
ndc.push("a ndc data");
LOG4CPLUS_DEBUG(logger, "this is a NDC test");
... ...
ndc.pop();
... ...
LOG4CPLUS_DEBUG(logger, "There should be no NDC...");
ndc.remove();
输出
0 [140375423698752] DEBUG TestConsole <a ndc data> - this is a NDC test
0 [140375423698752] DEBUG TestConsole <> - There should be no NDC...
-
- PatternLayout是一种有词法分析功能的模式布局器,类似正则表达式。以“%”作为开头的特殊预定义标识符,将产生特殊的格式信息。
- ”%%”,转义为%, 即,std::string pattern = “%%” 时输出: “%”
- “%c”,输出logger名称,比如std::string pattern =”%c” 时输出: “test_logger.subtest”,
也可以控制logger名称的显示层次,比如”%c{1}”时输出”test_logger”,其中数字表示层次。 - “%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”
- “%F”,输出当前记录器所在的文件名称,比如std::string pattern =”%F” 时输出: “main.cpp”
- “%L”,输出当前记录器所在的文件行号,比如std::string pattern =”%L” 时输出: “51”
- “%l”,输出当前记录器所在的文件名称和行号,比如std::string pattern =”%L” 时输出: “main.cpp:51”
- “%m”,输出原始信息,比如std::string pattern =”%m” 时输出: “teststr”,即上述代码中. LOG4CPLUS_DEBUG的第二个参数,这种实现机制可以确保原始信息被嵌入到带格式的信息中。
- “%n”,换行符,没什么好解释的
- “%p”,输出LogLevel,比如std::string pattern =”%p” 时输出: “DEBUG”
- “%t”,输出记录器所在的线程ID,比如std::string pattern =”%t” 时输出: “1075298944”
- “%x”,嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,NDC可以用对不同源的log信息(同时地)交叉输出进行区分,关于NDC方面的详细介绍会在下文中提到。
- 格式对齐,比如std::string pattern =”%-10m”时表示左对齐,宽度是10,此时会输出”teststr “,当然其它的控制字符也可以相同的方式来使用,比如”%-12d”,”%-5p”等等。
- PatternLayout是一种有词法分析功能的模式布局器,类似正则表达式。以“%”作为开头的特殊预定义标识符,将产生特殊的格式信息。
脚本读入
接口
// 加载配置文件。
log4cplus::PropertyConfigurator::doConfigure("path/xxx.log");
// 加载配置文件,定期刷新重新加载。
log4cplus::ConfigureAndWatchThread("path/xxx.log", 1000);
脚本实例
/*
* urconfig.properties
*/
/* 创建一个Logger, 指定加入的appender*/
log4cplus.rootLogger=TRACE, ALL_MSGS, TRACE_MSGS
/*创建一个追加行文本appender , 指定Layout为TTC类型*/
log4cplus.appender.ALL_MSGS=log4cplus::RollingFileAppender
log4cplus.appender.ALL_MSGS.File=all_msgs.log
log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout
/*创建一个追加行文本appender , 指定Layout为TTC类型*/
log4cplus.appender.TRACE_MSGS=log4cplus::RollingFileAppender
log4cplus.appender.TRACE_MSGS.File=trace_msgs.log
log4cplus.appender.TRACE_MSGS.layout=log4cplus::TTCCLayout
/*向appender添加Filter, 只接收TRACE类型*/
log4cplus.appender.TRACE_MSGS.filters.1=log4cplus::spi::LogLevelMatchFilter
log4cplus.appender.TRACE_MSGS.filters.1.LogLevelToMatch=TRACE
log4cplus.appender.TRACE_MSGS.filters.1.AcceptOnMatch=true
/*Filter由下向上执行。先禁止掉所有的Filter*/
log4cplus.appender.TRACE_MSGS.filters.2=log4cplus::spi::DenyAllFilter