如何创建log4j包装并获取正确的日志

时间:2011-09-08 05:04:46

标签: java logging log4j

我有多线程应用程序,我想在每条日志消息中添加一些文本信息 我创建工厂并扩展类,它工作正常

...
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我的文字

我应该怎么做日志文件显示一个类(带行号)调用我的记录器?

2 个答案:

答案 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