[英]How create log4j wrap and get correct logs
我有多线程应用程序,我想在我创建工厂和扩展类的每条日志消息中添加一些文本信息,它可以正常工作
...
protected Logger logger = Logger.getLogger("Test", new MyLog4JFactory());
...
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerFactory;
public class MyLog4JFactory implements LoggerFactory{
@Override
public Logger makeNewLoggerInstance(String arg0) {
return new MyLogger(arg0);
}
}
import org.apache.log4j.Logger;
public class MyLogger extends Logger{
protected MyLogger(String name) {
super(name);
}
private String getMessage(Object msg){
StringBuffer sb = new StringBuffer();
return sb.append(msg).append(" ").append("My text").toString();
}
@Override
public void debug(Object message) {
super.debug(getMessage(message));
}
@Override
public void error(Object message) {
super.error(getMessage(message));
}
@Override
public void fatal(Object message) {
super.fatal(getMessage(message));
}
@Override
public void info(Object message) {
super.info(getMessage(message));
}
@Override
public void warn(Object message) {
super.warn(getMessage(message));
}
}
但! 在日志中,我看到了包装器类
所有日志打印为
2011-09-08 10:45:49,359调试MyLogger (35) -Test1我的文本
日志文件显示一个类(带有行号)调用记录器时,我该怎么办?
我知道这是一个老问题,但是我想分享一个很好的解决方案:
将FQCN添加到您的类中,调用Logger.log方法,并将其传递给FQCN,如下所示:
public class MyLogger extends Logger{
private static String FQCN = MyLogger.class.getName();
...
@Override
public void debug(Object message) {
super.log(FQCN, org.apache.log4j.Level.DEBUG,message, null);
}
@Override
public void debug(Object message,Throwable t) {
super.log(FQCN, org.apache.log4j.Level.DEBUG,message, t);
}
}
(相同的方法也可以创建包装器...)
在您的log4j.properties文件中,从看起来像这样的行中删除%l
说明符:
log4j.appender.A1.layout.ConversionPattern=<...>
ConversionPattern
可以是PatternLayout
或其他东西。 这将阻止显示完全合格的呼叫类名称和线路号。
有关说明符的更多信息,请参见此处 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.