【转】 log4cpp 的使用
【转自】 http://sogo6.iteye.com/blog/1154315 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:
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::fatal()
Category::alert()
Category::crit()
Category::error()
Category::warn()
Category::notice()
Category::info()
Category::debug()
开发运行时,设为 DEBUG 级,而正式运营时,则设为 NOTICE ;
一定要显示出来的信息则可以用 NOTICE 或以上级别;
跟踪函数运行痕迹的信息用 INFO 级别;
运行时调试的信息用 DEBUG 级别;
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 : 回滚文件输出,对多个日志文件0,..., n-1,依次记录满后,回滚至第0个文件开始记录。
现在看一个 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"
ConversionPattern 参数解读,参阅源码 log4cpp-0.3.5rc3\src\PatternLayout.cpp
%n 回车换行
%c category 名字
%d 时间戳
%p 优先级
%r 距离上一次写 log 的间隔, 单位毫秒
%R 距离上一次写 log 的间隔, 单位秒
%t 线程名
%u 处理器时间
%x NDC ?
窃以为,以下格式就足够了,即输出 "时间 [线程名] 优先级 - log内容 回车换行"
%d [%t] %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
首先是初始化 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");
再举一个在自定义类中的使用
转载文章:
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 的使用的更多相关文章
- Log4cpp配置文件格式说明
Log4cpp配置文件格式说明 博客分类: log4cpp log4cpp log4cpp有3个主要的组件:categories(类别).appenders(附加目的地).和 layouts(布局) ...
- Log4cpp介绍及使用
Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能.使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流.内存字符串队列.文件.回滚文件.调试器.Wind ...
- 快速使用Log4Cpp
封了一下接口,快速使用. 其他的你都不用管了. 这里封装了需要读取外部conf文件配置输出项.否则可以用getInstance初始化日志类 #include "L4Cpp.h" v ...
- 【转】Log4cpp 封装
[转自]http://blog.csdn.net/ylioi/article/details/9049591 这篇文章对Log4cpp使用了宏定义和类进行封装,非常有借鉴意义. log4cpp 是参考 ...
- 自定义Log4cpp的日志输出格式
// 1. 实例化一个PatternLayout对象 log4cpp::PatternLayout* pLayout = new log4cpp::PatternLayout(); // 2. 实例化 ...
- log4cpp的初步使用
(1)下载log4cpp的工程,编译生成lib文件和dll库 下载路径为:http://sourceforge.net/projects/log4cpp/files/latest/download 如 ...
- log4cpp日志不能是溶液子体积
我们的项目用途log4cpp由于日志输出模块,但在使用中发现,假设Services,或者是在Windows Server版本号.不会有一个正常的日志切削现象.该日志已被写入到文件中,持续,即使超 ...
- log4cpp退出时内存泄露的修复方案
1.缘由 一直对log4cpp非常有好感,就在自己的项目中集成了log4cpp1.1.1版本,并围绕着它建立了一系列的封装函数方便外部调用.写完了一个测试代码后,忽然想看看自己写的程序有没有内存泄露问 ...
- Log4Cpp的使用(转)
本文介绍如何使用Log4CPP. Log4Cpp介绍 Log4Cpp的Api接口可以在http://log4cpp.sourceforge.net/api/index.html中查询得到. Log4C ...
随机推荐
- MES项目中出现的一个事务嵌套的使用场景
昨天在MES项目中,需要在业务逻辑的几个关键点记录错误信息,需要把错误信息写入数据表. 但是由于整个业务逻辑都是包在一个事务模板里面的 比如这样的: WhhTransactionTemplate tr ...
- Chart图形 [功能帮助类] Assistant创建显示图像的标签和文件 (转载)
点击下载 Assistant.zip /// <summary> /// 类说明:Assistant /// 联系方式:361983679 /// 更新网站:[url=http://www ...
- 避免 TCP/IP 端口耗尽
转载:http://www.cnblogs.com/tianzhiliang/archive/2011/06/27/2091214.html 当客户端启动到服务器的 TCP/IP 套接字连接时,客户端 ...
- jquery”ScriptResourceMapping
要“jquery”ScriptResourceMapping.请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping.”的解决办法. 1.先将aspnet.scri ...
- 注解 @RequestMapping
通过RequestMapping注解可以定义不同的处理器映射规则. 1.URL路径映射 @RequestMapping(value="/item")或@RequestMapping ...
- 24种设计模式--模版方法模式【Template Method Pattern】
周三,9:00,我刚刚坐到位置,打开电脑准备开始干活.“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的 ...
- Windows phone 之自定义控件(补充)
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x= ...
- php多行字符串输出
$content_header =<<<CONTENT_HEADER <section class="content-header"> <h ...
- php时间选择器亲测可以自己修改
由于前端的离职 造成我需要自己去做后台页面 所以有一个要填写生日的我就用了这个时间选择器 <?php /** * Created by PhpStorm. * User: Administ ...
- [CSS]overflow内容溢出
定义和用法 overflow 属性规定当内容溢出元素框时发生的事情. 说明 这个属性定义溢出元素内容区的内容会如何处理.如果值为 scroll,不论是否需要,用户代理都会提供一种滚动机制.因此,有 ...