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