使用slf4j / logback时如何打包webapp?

时间:2010-11-23 15:57:45

标签: tomcat maven packaging slf4j logback

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

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

为此,我将两个jar,logback-classic和logback-core复制到$ 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。

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

这不会按预期工作。记录框架使用大量静态变量(a.k.a。全局变量)。

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

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

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

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

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

答案 1 :(得分:1)

你是否尊重

  

在类路径上放置一个(并且只有一个)slf4j-nop.jar,slf4j-simple.jar,slf4j-log4j12.jar,slf4j-jdk14.jar或logback-classic.jar应该可以解决问题。

如果您使用例如hibernate它可能会在你的类路径中引入slf4j-log4j12.jar,所以你的类路径中可能有多个slf4j实现

对我而言,它适用于slf4j和log4j

答案 2 :(得分:0)

我们把所有的罐子放到Slf4j&回到Tomcat的shared / lib。然后,我们将一个全局logback.xml放入shared / classes。

但我仍然不知道这是不是一个好习惯。 我们必须按用户管理日志,因此我们设置MDC以使用SiftingAppender。 我有一个问题正在等待这个问题的答案:(