7

我想将带有 Logback 的 slf4j 改造为旧版应用程序。好消息是,遗留应用程序有自己的日志框架。所以我所要做的就是改变日志框架以记录到 slf4j 而不是 log4j。

它像梦一样工作。我很高兴,直到我注意到 Logback 为每个日志事件记录的位置:

Logger.java:...

哎呀!当我试图找出日志事件的来源时,这对我的开发人员没有多大帮助。

我如何告诉 Logback 在堆栈中向上查找几个级别以获取实际记录位置?

logger 类是一个实用程序类,其方法如下:

public static void debug(String clazz, String message) {
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz);
    logger.debug(message);
}
4

2 回答 2

13

找到了查看源代码的解决方案jcl-over-slf4j。slf4j 的大多数实现(包括 logback)使用实现的记录器LocationAwareLogger,它有一个 log 方法,它期望包装记录器类的完全限定类名作为它的参数之一:

private static final String FQCN = Logger.class.getName();


public static void debug(String clazz, String message) {
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz);
    if (logger instanceof LocationAwareLogger) {
        ((LocationAwareLogger) logger).log(null, FQCN, LocationAwareLogger.DEBUG_INT, message, null, null);
    } else {
        logger.debug(message);
    }
}
于 2010-08-16T11:47:30.577 回答
5

有关如何执行此操作,请参阅各种 XXX-over-slf4j 实现。

基本上你想完全替换你当前的记录器框架。不包装 slf4j。

编辑:

另一种方法可能是编写您自己的布局子类化您现在使用的布局,它对 %m、%l 等字段进行了修改,从而跳过了额外的堆栈帧。

于 2010-08-16T09:13:14.287 回答