关闭

log4cplus 学习速记

429人阅读 评论(0) 收藏 举报
分类:

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”等等。

脚本读入

接口

// 加载配置文件。
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

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:54797次
    • 积分:1474
    • 等级:
    • 排名:千里之外
    • 原创:79篇
    • 转载:13篇
    • 译文:3篇
    • 评论:11条
    最新评论