8

我有很多 Web 应用程序要构建/打包,我想分享他们的公共库。

关于日志记录,我想将 slf4j-api 与每个应用程序捆绑在一起,但考虑我的容器(目前是 tomcat)提供的实现

为此,我将 logback-classic 和 logback-core 这两个 jar 复制到 $CATALINA\lib 目录中。

不幸的是,在运行时,slf4j 与其实现之间的绑定失败并显示以下错误消息:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

我设法使其工作的唯一方法是将jar捆绑在war文件中。

有任何想法吗?

4

3 回答 3

8

这不会按预期工作。日志框架使用大量静态变量(也称为全局变量)。

因此,每次加载日志配置时,它都会为部署到容器的所有应用程序替换它。这通常不是你想要的。

将日志实现与您的 WAR 捆绑在一起,这样 Web 容器就可以确保每个 Web 应用程序都有自己的一组全局变量。

[编辑] 如果你真的想用相同的日志配置控制所有应用程序,你必须将所有日志类移动到容器中。这包括slf4j.

我强烈建议将日志配置放入 JAR 中并放在那里。或者部署一个只包含尽可能少代码的虚拟 Web 应用程序(以便 Tomcat 加载它)加上logback.xml

否则,应用程序的启动顺序将决定当您到达日志配置必须更改的点时的日志记录。

于 2010-11-23T16:02:49.487 回答
1

你尊重了吗

Placing one (and only one) of slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar on the class path should solve the problem.

?

if you use e.g. hibernate it might introduce slf4j-log4j12.jar in your classpath, so there might be more than one slf4j implementation in your classpath

for me it works with slf4j and log4j

于 2010-11-23T16:17:07.747 回答
0

We put all jar for Slf4j & Logback into shared/lib of Tomcat. Then, we put a global logback.xml into shared/classes.

But i still don't know if it is a good practice. We have to manage a log by user, so we set MDC in order to use SiftingAppender. I have a question which is waiting for an answer on this subject :(

于 2014-09-10T09:55:11.853 回答