使用log4j包装器在日志语句中打印“ source”类

Mor*_*hel 7 java log4j

我的应用程序有一个自制的日志记录类,我将在后台使用log4j进行迁移。但是,由于我正在使用homebrew类将应用程序的其余日志记录语句传递给log4j,因此输出语句被记录为来自包装类而不是源类。

除了为每个log语句创建新的org.apache.log4j.Logger实例之外,是否有办法确保显示“正确的”源?我也尝试过使用Logger.log(String callerFQCN,Priority level,Object message,Throwable t)方法,但是它似乎不起作用,例如:

public class Logger2 {

    public static org.apache.log4j.Logger log4JLogger = org.apache.log4j.Logger.getLogger(Logger2.class);

    public static void warning(Object source, String message) {

        log(source, message, Level.WARN, null)
    }

    private static void log(Object source, String message, Level level, Throwable t) {

        String className = source.getClass().getName();
        System.out.println("Logging class should be " + className);
        log4JLogger.log(className, loggingLevel, message, t);
    }
}
Run Code Online (Sandbox Code Playgroud)

当调用者:

public void testWarning() {
    Logger2.warning(new Integer(3), "This should warn");
}
Run Code Online (Sandbox Code Playgroud)

印刷品:

Logging class should be java.lang.Integer
2010-05-25 10:49:57,152 WARN                              test.Logger2 - This should warn
Run Code Online (Sandbox Code Playgroud)

Esp*_*pen 6

我自制的日志记录解决方案使用log4j的LocationInfo类查找源代码信息。

使用此解决方案,该locationInfo对象包含来自该对象的信息,该信息使用调用我的记录器loggerName

这是使用log4j记录的我的记录器的简化版本:

public void log(Level level, String message) {
    LocationInfo locationInfo = new LocationInfo(new Throwable(),
            loggerName);

    MDC.put(LINE_NUMBER, locationInfo.getLineNumber());
    MDC.put(FILE_NAME, locationInfo.getFileName());
    MDC.put(CLASS_NAME, locationInfo.getClassName());
    MDC.put(METHOD_NAME, locationInfo.getMethodName());
    MDC.put(FQMETHOD_NAME, locationInfo.getClassName() + "."
            + locationInfo.getMethodName());

    logger.log(level, message);

    MDC.remove(LINE_NUMBER);
    MDC.remove(FILE_NAME);
    MDC.remove(CLASS_NAME);
    MDC.remove(METHOD_NAME);
    MDC.remove(FQMETHOD_NAME);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句:LevelMDCLogger类都是log4j类。

回复评论:

MDC对象存储在该ThreadLocal对象上,并且可供log4j记录器访问。

从MDC Java文档中:

MDC是基于每个线程进行管理的。