包装slf4j API

Sti*_*ael 7 java legacy logback slf4j

我想用Logback将slf4j改造成遗留应用程序.好的是,遗留应用程序有自己的日志框架.所以我所要做的就是改变日志框架以登录到slf4j而不是log4j.

它就像一场梦.我很高兴,直到我注意到为每个日志事件记录的Logback位置:

Logger.java:...
Run Code Online (Sandbox Code Playgroud)

哎呀!在试图弄清楚日志事件的来源时,这对我的开发人员来说无济于事.

如何告诉Logback在堆栈中查看实际位置的几个级别?

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

public static void debug(String clazz, String message) {
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz);
    logger.debug(message);
}
Run Code Online (Sandbox Code Playgroud)

Sti*_*ael 12

找到解决方案的源头jcl-over-slf4j.slf4j的大多数实现(包括logb​​ack)都使用实现的记录器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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Tho*_*sen 5

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

基本上,您希望完全替换当前的记录器框架.不包装slf4j.

编辑:

另一种方法可能是编写您自己的布局子类化您现在使用的布局,它具有修改后的%m,%l等字段的含义,它会跳过额外的堆栈帧.

  • 我考虑过这个解决方案,但目前没有预算可以替换分散在50多个项目中的10000多个日志语句. (2认同)
  • 如果您将记录器框架替换为行为相同的另一个(提供相同的接口,类和方法),而是像slf4j的其他仿真器框架之一那样,它应该为您提供所需的行为.否则创建自己的布局 - 请参阅更新的答案. (2认同)