上一篇中说到多用户时的一点小问题,(可以在这里查看http://blog.csdn.net/spirit_only/archive/2008/01/11/2036790.aspx),经过研究可以通过下面的方法解决。
- 下载Log4cxx的源码,我下的是0.9.7,不知道是什么原因开发人员竟然在这个版本中将threshold这个重要的属性忽略了。通过该属性的设置,用户可以过滤掉threshold对应的level以下的信息。打开msvc目录中的工程,找到fileappender.ccp文件,在setOption()函数中添加下面的代码:
else if (StringHelper::equalsIgnoreCase(option, _T("threshold")))
{
setThreshold(OptionConverter::toLevel(value, Level::ALL));
}注意这里的threshold属性,这将是我们配置多用户的关键地方。设置好后重新编译,OK,等待编译好dll和lib,并将它们添加到自己的工程中。
-
还是上次的那个properties文件
[ code ]
# 设置root logger为DEBUG级别,使用了ca , fa , err三个Appender
log4j.rootLogger = DEBUG , ca , fa , err
#设置spirit为ERROR级别,继承rootLogger的Appender
log4j.spirit = ERROR
#对Appender ca进行设置:
#这是一个控制台类型的Appender
#输出格式(layout)为PatternLayout
log4j.appender.ca = org.apache.log4j.ConsoleAppender
log4j.appender.ca.layout = org.apache.log4j.PatternLayout
log4j.appender.ca.layout.ConversionPattern = %d [ %t ] %-5p %.16c - %m%n
#对Appender fa进行设置:
# 这是一个文件类型的Appender,
# 其输出文件(File)为./debug.log,
# 输出方式(Append)为覆盖方式,
# 输出格式(layout)为PatternLayout
log4j.appender.fa = org.apache.log4j.FileAppender
log4j.appender.fa.File = ./debug.log
log4j.appender.fa.Append = true
log4j.appender.fa.layout = org.apache.log4j.PatternLayout
log4j.appender.fa.layout.ConversionPattern = %d [ %t ] %-5p %.16c %x - %m%n
#对Appender err进行设置:
# 这是一个文件类型的Appender,
# 其输出文件(File)为./error.log,
# 输出方式(Append)为覆盖方式,
# 输出格式(layout)为PatternLayout
log4j.appender.err = org.apache.log4j.FileAppender
log4j.appender.err.File = ./error.log
log4j.appender.err.threshold = ERROR
log4j.appender.err.Append = true
log4j.appender.err.layout = org.apache.log4j.PatternLayout
log4j.appender.err.layout.ConversionPattern = %d [ %t ] %-5p %.16c %x - %m%n
[ /code ]
-
测试程序如下:
#include < string >
#include < iostream >
using namespace std;
#include < log4cxx / logger.h >
#include < log4cxx / propertyconfigurator.h >
using namespace log4cxx;
using namespace log4cxx::helpers;
void main()
{
String trace = _T("spirit");
String Property = _T("E:/spirit_only/Test_log4cxx/log4cxx.properties");
PropertyConfigurator::configure(Property);
LoggerPtr traceLogger = Logger::getLogger(trace);
LoggerPtr parent = traceLogger->getParent();
traceLogger->error(_T("How to use?"));
traceLogger->debug(_T("I am in debug"));
}
OK,编译并执行我们的代码,然后打开文件error.log和debug.log可以看到:
error.log
2008-01-11 14:41:47,750 [2244] ERROR spirit - How to use?
debug.log
2008-01-11 14:41:47,750 [2244] ERROR spirit - How to use?
2008-01-11 14:41:47,750 [2244] DEBUG spirit - I am in debug
总结:通过上面的方法,我们就可以创建多个用户,将不同级别的信息定向到特定的地方,方便我们使用。
补充:1. Log4cxx0.9.7中预定义的Level及其级别为:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF并不像官方手册中写道的包括了TRACE,这个在0.10.0中新加的。
2. Log4cxx0.9.7和Log4cxx0.10.0中有关函数和定义区别还是比较大的,使用时根据情况进行修改。