我有多线程应用程序,我想在每条日志消息中添加一些文本信息 我创建工厂并扩展类,它工作正常
...
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 DEBUG MyLogger (35) - Test1我的文字
我应该怎么做日志文件显示一个类(带行号)调用我的记录器?
答案 0 :(得分:3)
我知道这是一个老问题,但我想分享一个很好的解决方案:
将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);
}
}
(同样适用于创建包装器......)
答案 1 :(得分:0)
在log4j.properties文件中,从看起来像这样的行中删除%l
说明符:
log4j.appender.A1.layout.ConversionPattern=<...>
ConversionPattern
可能是PatternLayout
或其他内容。这将阻止显示完全限定的呼叫类名称和行号。
可以找到有关说明符的更多信息here。