Log4cpp配置文件格式说明
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:
- log4cpp::IdsaAppender // 发送到IDS或者logger,
- log4cpp::FileAppender // 输出到文件
- log4cpp::RollingFileAppender // 输出到回卷文件,即当文件到达某个大小后回卷
- log4cpp::OstreamAppender // 输出到一个ostream类
- log4cpp::RemoteSyslogAppender // 输出到远程syslog服务器
- log4cpp::StringQueueAppender // 内存队列
- log4cpp::SyslogAppender // 本地syslog
- log4cpp::Win32DebugAppender // 发送到缺省系统调试器
- 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(),有
- void debug(const char* stringFormat, ...) throw();
- void debug(const std::string& message) throw();
关于优先级别使用的建议
开发运行时,设为 DEBUG 级,而正式运营时,则设为 NOTICE ;
一定要显示出来的信息则可以用 NOTICE 或以上级别;
跟踪函数运行痕迹的信息用 INFO 级别;
运行时调试的信息用 DEBUG 级别;
举例说明
- void initialize(int argc, char* argv[])
- {
- log.info("initialize() : argc=%d", argc);
- for (int i=0; i < argc; ++i)
- {
- log.debug("initialize() : argv[%d]=%s", i, argv[i]);
- }
- log.notice("initialize() : done");
- }
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
- try
- {
- log4cpp::PropertyConfigurator::configure("log4cpp.properties");
- }
- catch (log4cpp::ConfigureFailure & f)
- {
- std::cerr << "configure problem " << f.what() << std::endl;
- }
初始化完成后,就可以这样用了(具体的应用技巧,你自己摸索吧)
- log4cpp::Category & log = log4cpp::Category::getInstance(std::string("sample"));
- log.debug("test debug log");
- log.info("test info log");
- // 用 sample.son
- log4cpp::Category & log = log4cpp::Category::getInstance(std::string("sample.son"));
- log.debug("test debug log of son");
- log.info("test info log of son");
- // 用 sample.daughter
- log4cpp::Category & log = log4cpp::Category::getInstance(std::string("sample.daughter"));
- log.debug("test debug log of daughter");
- log.info("test info log of daughter");
再举一个在自定义类中的使用
- #include <log4cpp/Category.hh>
- namespace demo
- {
- class Sample
- {
- public:
- Sample();
- ~Sample();
- public:
- Testing(int i);
- private:
- static log4cpp::Category & log;
- };
- }
- #include "Sample.h"
- namespace demo
- {
- log4cpp::Category & Sample::log = log4cpp::Category::getInstance(std::string("sample"));
- Sample::Sample()
- {
- log.debug("Sample::Sample()");
- }
- Sample::~Sample()
- {
- log.debug("Sample::~Sample()");
- }
- Sample::Testing(int i)
- {
- log.debug("Sample::Testing() : i=%d", i);
- }
- }
转载文章:
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)
Log4cpp配置文件格式说明的更多相关文章
- 配置文件格式用哪个?文件夹+纯文本文件,XML,SQLite
稍具规模的软件都会须要一个配置文件来支持软件的执行.眼下常见的配置文件格式有纯文本.XML.SQLite.自己定义二进制格式,怎样进行选择呢? 1 纯文本--永远不会失效的文件格式 文本化是传统Uni ...
- ini配置文件格式
转自:http://blog.sina.com.cn/s/blog_6988593e0101e6i4.html 程序没有任何配置文件,那么它对外是全封闭的,一旦程序需要修改一些参数必须要修改程序代码 ...
- INI配置文件格式解析
INI配置文件有三要素parameters,sections和comments. 1.parameters 指一条配置,就像key = value这样的. 2.sections sections是pa ...
- Maven项目的pom.xml配置文件格式初识
Maven项目 有pom.xml文件的项目就已经是一个maven项目了,但是还没有被maven托管,我们需要将该项目添加为maven项目 <project xmlns="http:// ...
- SQLHelper用到的配置文件格式
格式要牢记 <configuration> <connectionStrings> <add name="dbConnStr" connectionS ...
- linux模范配置文件格式
模范配置文件 #--------------------------------------------------------------------- # Global settings #--- ...
- 【转】 log4cpp 的使用
[转自] http://sogo6.iteye.com/blog/1154315 Log4cpp配置文件格式说明 log4cpp有3个主要的组件:categories(类别).append ...
- Log4cpp 使用手册
参考资料: log4cpp 配置 与 使用http://www.cnblogs.com/welkinwalker/archive/2011/06/23/2088197.html 便利的开发工具-log ...
- Log4cpp介绍及使用
Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能.使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流.内存字符串队列.文件.回滚文件.调试器.Wind ...
随机推荐
- js-图标控件
1.highcharts http://www.hcharts.cn/ 2.echarts echarts.baidu.com
- 成为JavaGC专家(1)—深入浅出Java垃圾回收机制
转载自:http://www.importnew.com/1993.html 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC ...
- linux删除文件后没有释放空间
转载 http://blog.csdn.net/wyzxg/article/details/4971843 今天发现一台服务器的home空间满了,于是要清空无用的文件,当我删除文件后,发现可用空间没有 ...
- 76.Android之EventBus源码解析
转载:http://p.codekk.com/blogs/detail/54cfab086c4761e5001b2538 1. 功能介绍 1.1 EventBus EventBus 是一个 Andro ...
- [vijos1982][NOIP2015]子串
Description 有两个仅包含小写英文字母的字符串和.现在要从字符串中取出个互不重叠的非空子串,然后把这个子串按照其在字符串中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得这 ...
- PHOG特征
PHOG特征 2016年7月13日 21:07:57 什么是PHOG PHOG是Pyramid HOG(pyramid histogram of oriented gradient)的简称,是在图像尺 ...
- WPF弹出取消确定框
MessageBoxResult dr = MessageBox.Show("是否在"+ConfigHelper.GetAppSetting("SourceDBName& ...
- Linux Crontab 定时任务 命令详解
一. Crontab 介绍 crontab命令的功能是在一定的时间间隔调度一些命令的执行. 1.1 /etc/crontab 文件 在/etc目录下有一个crontab文件,这里存放有系统运行的一些调 ...
- Servlet基础-手工编写第一个servlet
[手工编写第一个servlet] [步骤] 1.继承HttpServlet 2.重写doGet()或者doPost()方法 //这个doGet或者doPost方法取决用户提交的方式 3.在web.x ...
- PHP设计模式(一)
在码PHP程序的时候,为了以后更好地维护代码和理解代码,用一些合适的设计模式是必不可少的,下面我和大家首先分享下单例模式,有错误或者不恰当的地方,还望PHPer们帮我指出. 单例模式 PHP中的对象生 ...