本文转载自:http://www.cnblogs.com/welkinwalker/archive/2011/06/23/2088197.html
另一个非常优秀的特征就是通过读取配置文件,确定category、appender、layout等对象。也是我们非常推荐的使用方式,可以灵活地通过配置文件定义所有地对象及其属性,不用重新编码,动态更改日志记录的策略。
Log4cpp主要提供了 log4cpp::PropertyConfigurator 和log4cpp::SimpleConfigurator两种机制(文件格式),但 log4cpp::SimpleConfigurator将来不再支持了,而且格式非常简单,这里就不多说明,自己看源码吧。
配置文件的格式和log4j的配置文件一样,是标准的java属性文件格式。下面是附带的例子配置文件:
# 定义了3个category sub1, sub2, sub3
# 其中sub2和sub3设置了additivity属性为false;sub1的additivity属性默认为true
rootCategory=DEBUG, rootAppender
category.sub1=,A1
category.sub2=INFO, A2
additivity.sub2=false
category.sub3=ERROR, A3
additivity.sub3=false
# 定义rootAppender类型和layout属性,这里使用了BasicLayout
appender.rootAppender=org.apache.log4cpp.ConsoleAppender
appender.rootAppender.layout=org.apache.log4cpp.
#定义A1的属性,这里使用了SimpleLayout
appender.A1=org.apache.log4cpp.FileAppenderappender.A1.fileName=./log/A1.log
appender.A1.layout=org.apache.log4cpp.SimpleLayout
#定义A2的属性,这里使用了PatternLayout
appender.A2=org.apache.log4cpp.ConsoleAppenderappender.A2.layout=org.apache.log4cpp.PatternLayout
appender.A2.layout.ConversionPattern=The message '%m' at time %d%n
#定义A3的属性
appender.A3=org.apache.log4cpp.RollingFileAppender
appender.A3.fileName=./log/A3.log
appender.A3.maxFileSize=50
appender.A3.maxBackupIndex=3
appender.A3.backupPattern=%Y-%m-%d
appender.A3.layout=org.apache.log4cpp.PatternLayout
appender.A3.layout.ConversionPattern=%d{%Y-%m-%d %H:%M:%S} [%p]: [%c] %m%n
带配置文件的程序举例 :
#include "log4cpp/PropertyConfigurator.hh"
int main(int argc, char* argv[]) {
// 1 读取解析配置文件
// 读取出错, 完全可以忽略,可以定义一个缺省策略或者使用系统缺省策略
// BasicLayout输出所有优先级日志到ConsoleAppender
try
{
log4cpp::PropertyConfigurator::configure("./log4cpp.conf");
}
catch (log4cpp::ConfigureFailure& f)
{
std::cout << "Configure Problem " << f.what() << std::endl;
return -1;
}
//2 实例化category对象
// 这些对象即使配置文件没有定义也可以使用,不过其属性继承其父category
// 通常使用引用可能不太方便,可以使用指针,以后做指针使用
log4cpp::Category& root = log4cpp::Category::getRoot();
log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));
log4cpp::Category& sub2 = log4cpp::Category::getInstance(std::string("sub2"));
log4cpp::Category& sub3 = log4cpp::Category::getInstance(std::string("sub3"));
log4cpp::Category& sub4 = log4cpp::Category::getInstance(std::string("sub4"));
// 正常使用这些category对象进行日志处理。
root.fatal("root's log");
// sub1 has appender A1 and rootappender. since the additivity property is set true by default
sub1.info("sub1's log");
// sub2 has appender A2 appender. since the additivity property is set to false
sub2.alert("sub2's log");
// sub3 only has A3 appender. since the additivity property is set to false
sub3.debug("sub3's log");
sub3.alert("sub3's log");
// sub4 can not be found in the config file, so the root category's appender and layout are used
sub4.warn("sub4's log");
return 0;
}
终端打印出来的log:
1308829427 WARN sub4 : sub4's log
INFO : sub1's log
log/A3.log的内容:
2011-06-23 19:27:50 [ALERT]: [sub3] sub3's log