Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包装slf4j API_Java_Legacy_Logback_Slf4j - Fatal编程技术网

Java 包装slf4j API

Java 包装slf4j API,java,legacy,logback,slf4j,Java,Legacy,Logback,Slf4j,我想用Logback将slf4j改造成一个遗留应用程序。好消息是,遗留应用程序有自己的日志框架。所以我所要做的就是改变日志框架,将日志记录到slf4j而不是log4j 这就像一场梦。我很高兴,直到我注意到每个日志事件的日志记录位置: Logger.java:... 哎呀!当我的开发伙伴试图找出日志事件的来源时,这对他们没有多大帮助 我如何告诉Logback在堆栈中查找几个级别以查找要记录的实际位置 logger类是一个实用程序类,其方法如下: public static void debug(

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

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

Logger.java:...
哎呀!当我的开发伙伴试图找出日志事件的来源时,这对他们没有多大帮助

我如何告诉Logback在堆栈中查找几个级别以查找要记录的实际位置

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

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

请参阅各种XXX-over-slf4j实现以了解如何实现

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

编辑:


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

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

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);
    }
}

类似的问题:当它使用log4j时,它工作了吗?我认为,由于您更新了一个现有的日志类,您没有向调用堆栈添加额外的帧,因此log4j版本应该也出现了同样的问题。log4j在其公共API中公开了一个log方法,该方法在堆栈上显示了一个额外的帧,而slf4j没有。是的,它与log4j一起工作。我考虑过这个解决方案,但目前没有预算来替换分散在50多个项目中的10000多个日志语句。您不需要更改日志语句,但它调用的代码(希望是在库中)logger框架有10000多个方法调用来自所有项目。因此,如果我替换了logger框架,那么我是否也必须替换对它的所有方法调用?如果您将logger框架替换为另一个行为相同(提供相同的接口、类和方法)但行为与slf4j的其他仿真器框架类似的框架,那么它应该为您提供所需的行为。否则,创建自己的布局-请参阅更新的答案。非常好的答案。我正在寻找log4j绑定的解决方案,并找到了Log4jLoggerAdapter。太糟糕了,包装器不支持消息格式。