Log4cpp配置文件格式说明

Log4cpp配置文件格式说明

博客分类:

log4cpp

log4cpp有3个主要的组件:categories(类别)、appenders(附加目的地)、和 layouts(布局),layout类控制输出日志消息的显示样式(看起来像什么)。log4cpp当前提供以下layout格式: 
log4cpp::BasicLayout    // 以“时间戳 优先级(priority,下文介绍) 
                        // 类别(category,下文介绍) 
                        // NDC标签 
log4cpp::PatternLayout  // 让用户根据类似于 C 语言 printf 函数的转换模式来指定输出格式。 
log4cpp::SimpleLayout   // 以“优先级(priority) - 日志信息”格式显示。

appender类用来输出日志(被layout格式化后的)到一些设备上。比如文件、syslog服务、 
某个socket等。可以定义自己的appender类输出日志信息到别的设备上,比如应用自身的 
日子处理进程、数据库等。appender和layout的关系是layout附在appender上, 
appender类调用layout处理完日志消息后,记录到某个设备上。log4cpp当前 
提供以下appender:

C++代码  

  1. log4cpp::IdsaAppender   // 发送到IDS或者logger,
  2. log4cpp::FileAppender   // 输出到文件
  3. log4cpp::RollingFileAppender  // 输出到回卷文件,即当文件到达某个大小后回卷
  4. log4cpp::OstreamAppender   // 输出到一个ostream类
  5. log4cpp::RemoteSyslogAppender  // 输出到远程syslog服务器
  6. log4cpp::StringQueueAppender  // 内存队列
  7. log4cpp::SyslogAppender   // 本地syslog
  8. log4cpp::Win32DebugAppender  // 发送到缺省系统调试器
  9. log4cpp::NTEventLogAppender  // 发送到win 事件日志

category 类真正完成记录日志功能,两个主要组成部分是appenders和priority(优先级)。优先级控制哪类日志信息可以被这个category记录,当前优先级分为:NOTSET, DEBUG, INFO, NOTICE, WARN, ERROR, CRIT, ALERT 或 FATAL/EMERG 。每个日志信息有个优先级,每个category有个优先级,当消息的优先级大于等于category的优先级时,这个消息才会被category记录,否则被忽略。优先级的关系如下。category类和appender的关系是,多个appender附在category上,这样一个日志消息可以同时输出到多个设备上。 
NOTSET < DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERG 
category被组织成一个树,子category创建时优先级缺省NOTSET,category缺省会继承父category的appender。而如果不希望这种appender的继承关系,log4cpp允许使用additivity 标签,为false时新的appender取代category的appender列表。 
log4cpp可以用手动方式使用,也可以使用配置文件使用,用配置文件的方式简单,便捷。所有,现在都用配置文件的方式。

log 的优先级别解读,参阅源码 log4cpp-0.3.5rc3\include\log4cpp\Priority.hh

由高到低

EMERG 
FATAL 
ALERT 
CRIT 
ERROR 
WARN 
NOTICE 
INFO 
DEBUG 
NOTSET 
对应到 Category 相应函数,参阅源码 log4cpp-0.3.5rc3\include\log4cpp\Category.hh 
Category::emerg() 
Category::fatal() 
Category::alert() 
Category::crit() 
Category::error() 
Category::warn() 
Category::notice() 
Category::info() 
Category::debug() 
以上函数都有 2 个重载函数,可分别接受格式化字串或 std::string,例如 debug(),有

C++代码  

  1. void debug(const char* stringFormat, ...) throw();
  2. void debug(const std::string& message) throw();

关于优先级别使用的建议 
开发运行时,设为 DEBUG 级,而正式运营时,则设为 NOTICE ; 
一定要显示出来的信息则可以用 NOTICE 或以上级别; 
跟踪函数运行痕迹的信息用 INFO 级别; 
运行时调试的信息用 DEBUG 级别; 
举例说明

C++代码  

  1. void initialize(int argc, char* argv[])
  2. {
  3. log.info("initialize() : argc=%d", argc);
  4. for (int i=0; i < argc; ++i)
  5. {
  6. log.debug("initialize() : argv[%d]=%s", i, argv[i]);
  7. }
  8. log.notice("initialize() : done");
  9. }

log4cpp 的 category 分为 rootCategory 和其它自定义的 category。 
而每个 category 都可以输出到多个 appender。并且 category 也是有包含关系的。 
例如 rootCategory 就是所有 category 的根。而自定义的 category 也可以在配置文件中定义其包含关系。 
先看一个 rootCategory 的配置 
log4cpp.rootCategory=DEBUG, console, sample 
这个定义里,指定了 rootCategory 的 log 优先级是 DEBUG,其 appender 有 2 个,分别是 console 和 sample。 
即是说,等号右边内容以逗号分隔,第一项是优先级别,接下来的都是 appender 名字,可以有一个或多个。 
现在来看看自定义的 category 
log4cpp.category.demo=DEBUG, sample 
这里定义了一个名字为 demo 的 category,其优先级为 DEBUG,appender 为 sample。 
注意, category 和 appender 名字可以完全相同。 
再来看看有包含关系的 category 的定义 
log4cpp.category.demo.son=DEBUG, son 
log4cpp.category.demo.daughter=DEBUG, daughter 
以上定义了 2 个 category,名字分别为 son 和 daughter,其父 category 为 demo。 
son 产生的 log 会写到 son 和 demo 的 appender 中。同理,daughter 的 log 会写到 daughter 和 demo 的 appender 中。 
现在来看看 appender 的定义。appender 有很多种,我这里只介绍几种,分别是 
ConsoleAppender : 控制台输出,即 std::cout 
Win32DebugAppender : VC IDE 的输出,即 ::OutputDebugString 
FileAppender : 文件输出 
RollingFileAppender : 有待研究 
现在看一个 ConsoleAppender 的例子 
log4cpp.appender.console=ConsoleAppender 
log4cpp.appender.console.layout=PatternLayout 
log4cpp.appender.console.layout.ConversionPattern=%d [%p] - %m%n 
以上信息解释为:一个名为 console 的 appender,其类型为 ConsoleAppender,即 控制台输出 log 输出的布局是 指定的样式 
输出的格式 是 "%d [%p] - %m%n" (稍后再解释) 
再看一个 FileAppender 的例子 
log4cpp.appender.sample=FileAppender 
log4cpp.appender.sample.fileName=sample.log 
log4cpp.appender.sample.layout=PatternLayout 
log4cpp.appender.sample.layout.ConversionPattern=%d [%p] - %m%n 
以上信息解释为:一个名为 sample 的 appender,其类型为 FileAppender,即 文件输出指定的 log 文件名为 sample.log,输出的布局是 指定的样式,输出的格式 是 "%d [%p] - %m%n" 
对应 category 和 appender 的配置方式,可以发现 
category 是 "log4cpp.category." + "category name" 
category 名字可以用 "." 分隔,以标识包含关系 
appender 是 "log4cpp.appender." + "appender name" 
appender 名字 不能 用 "." 分隔,即是说 appender 是没有包含关系的 
现在看一个完整的配置文件例子 
#定义 root category 的属性 
log4cpp.rootCategory=DEBUG, console

#定义 console 属性 
log4cpp.appender.console=ConsoleAppender 
log4cpp.appender.console.layout=PatternLayout 
log4cpp.appender.console.layout.ConversionPattern=%d [%p] - %m%n

#定义 sample category 的属性 
log4cpp.category.sample=DEBUG, sample

#定义 sample appender 的属性 
log4cpp.appender.sample=FileAppender 
log4cpp.appender.sample.fileName=sample.log 
log4cpp.appender.sample.layout=PatternLayout 
log4cpp.appender.sample.layout.ConversionPattern=%d [%p] - %m%n

#定义 sample.son category 的属性 
log4cpp.category.sample.son=DEBUG, son

#定义 son appender 的属性 
log4cpp.appender.son=FileAppender 
log4cpp.appender.son.fileName=son.log 
log4cpp.appender.son.layout=PatternLayout 
log4cpp.appender.son.layout.ConversionPattern=%d [%p] - %m%n

#定义 sample.daughter category 的属性 
log4cpp.category.sample.daughter=DEBUG, daughter

#定义 daughter appender 的属性 
log4cpp.appender.daughter=FileAppender 
log4cpp.appender.daughter.fileName=daughter.log 
log4cpp.appender.daughter.layout=PatternLayout 
log4cpp.appender.daughter.layout.ConversionPattern=%d [%p] - %m%n 
ConversionPattern 参数解读,参阅源码 log4cpp-0.3.5rc3\src\PatternLayout.cpp 
%m log message 内容, 即 用户写 log 的具体信息 
%n 回车换行 
%c category 名字 
%d 时间戳 
%p 优先级 
%r 距离上一次写 log 的间隔, 单位毫秒 
%R 距离上一次写 log 的间隔, 单位秒 
%t 线程名 
%u 处理器时间 
%x NDC ? 
窃以为,以下格式就足够了,即输出 "时间 [线程名] 优先级 - log内容 回车换行" 
%d [%t] %p - %m%n 
配置的知识就差不多了,现在看看实际代码应用 
首先是初始化 log4cpp 的配置,例如我的配置文件名是 log4cpp.properties

C++代码  

  1. try
  2. {
  3. log4cpp::PropertyConfigurator::configure("log4cpp.properties");
  4. }
  5. catch (log4cpp::ConfigureFailure & f)
  6. {
  7. std::cerr << "configure problem " << f.what() << std::endl;
  8. }

初始化完成后,就可以这样用了(具体的应用技巧,你自己摸索吧)

C++代码  

  1. log4cpp::Category & log = log4cpp::Category::getInstance(std::string("sample"));
  2. log.debug("test debug log");
  3. log.info("test info log");
  4. // 用 sample.son
  5. log4cpp::Category & log = log4cpp::Category::getInstance(std::string("sample.son"));
  6. log.debug("test debug log of son");
  7. log.info("test info log of son");
  8. // 用 sample.daughter
  9. log4cpp::Category & log = log4cpp::Category::getInstance(std::string("sample.daughter"));
  10. log.debug("test debug log of daughter");
  11. log.info("test info log of daughter");

再举一个在自定义类中的使用

C++代码  

  1. #include <log4cpp/Category.hh>
  2. namespace demo
  3. {
  4. class Sample
  5. {
  6. public:
  7. Sample();
  8. ~Sample();
  9. public:
  10. Testing(int i);
  11. private:
  12. static log4cpp::Category & log;
  13. };
  14. }
  15. #include "Sample.h"
  16. namespace demo
  17. {
  18. log4cpp::Category & Sample::log = log4cpp::Category::getInstance(std::string("sample"));
  19. Sample::Sample()
  20. {
  21. log.debug("Sample::Sample()");
  22. }
  23. Sample::~Sample()
  24. {
  25. log.debug("Sample::~Sample()");
  26. }
  27. Sample::Testing(int i)
  28. {
  29. log.debug("Sample::Testing() : i=%d", i);
  30. }
  31. }

转载文章: 
1. 便利的开发工具-log4cpp快速使用指南(http://www.ibm.com/developerworks/cn/linux/l-log4cpp/index.html) 
2. example of log4cpp properties configuration(http://blog.chinaunix.net/u1/50766/showart_400018.html)

时间: 2024-08-11 23:27:08

Log4cpp配置文件格式说明的相关文章

配置文件格式用哪个?文件夹+纯文本文件,XML,SQLite

稍具规模的软件都会须要一个配置文件来支持软件的执行.眼下常见的配置文件格式有纯文本.XML.SQLite.自己定义二进制格式,怎样进行选择呢? 1 纯文本--永远不会失效的文件格式 文本化是传统Unix哲学的教条之中的一个,可见其巨大威力.大多数类Unix系统的软件配置文件都是採用了纯文本格式. 比如/etc/inittab, /etc/fstab, httpd.conf等等. 1.1 长处 (1)可读性强 配置文件不仅须要让机器理解,也须要让人理解. 纯文本就很easy让人理解. (2)存在大

ini配置文件格式

转自:http://blog.sina.com.cn/s/blog_6988593e0101e6i4.html  程序没有任何配置文件,那么它对外是全封闭的,一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,为了让程序出厂后还能根据需要进行必要的配置,所以要用配置文件:配置文件有很多种,如INI配置文件,XML配置文件,cfg配置文件,还有就是可以使用系统注册表等. 本文主要介绍INI文件的格式信息. INI "就是英文 "initialization"的头三个字母的

rhel7网卡/网桥配置文件格式

1.网卡配置格式文件 vim  /etc/sysconfig/network-scripts/ifcfg-lan TYPE=EthernetBOOTPROTO=noneNAME=lanDEVICE=eno16777736ONBOOT=yesBRIDGE=br0 2.网桥配置格式文件 vim  /etc/sysconfig/network-scripts/ifcfg-br0 TYPE=BridgeBOOTPROTO=noneIPADDR0=10.1.128.20PREFIX0=16GATEWAY0

Maven项目的pom.xml配置文件格式初识

Maven项目 有pom.xml文件的项目就已经是一个maven项目了,但是还没有被maven托管,我们需要将该项目添加为maven项目 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

Log4cpp介绍及使用

Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能.使用log4cpp,能够非常便利地将日志或者跟踪调试信息写入字符流.内存字符串队列.文件.回滚文件.调试器.Windows日志.本地syslog和远程syslogserver中. 1.Log4cpp简单介绍 Log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致.其类似的支持库还包含Java(log4j),C++(log4cpp.log4cplus),C(l

log4j日志基本配置

Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置. 1.Loggers Loggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用

log4j的配置信息

首先,在项目中的classes 中新建立一个log4j.properties文件即可: 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是对Logger.Appender及Layout的分别使用.Log4j支持两种配置文件格式,一种是XML格式的文件,一种是java properties(key=value)[Java特性文件(键=值)].(这里只说明properties文件) 1.配置根Logger 其语法为: log4j.rootLogger = [ lev

Log4J日志配置详解

一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置. 1.Loggers Loggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR <

网络基础配置

1.网络基础知识一台主机如果可以连接公网,比如访问www.baidu.com 那么这台主机必然会有 ipaddress GATEWAY     dns       主机域名转换成ip的服务器 ############ipaddress############## tcp/ip ipv4 2进制32位 254.254.254.254/255.255.255.0 11111110.11111110.11111110.11111110/11111111.11111111.11111111.000000