【问题标题】:How to package webapp when using slf4j/logback?使用 slf4j/logback 时如何打包 webapp?
【发布时间】:2010-11-23 15:57:44
【问题描述】:

我有很多 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 文件中。

有什么想法吗?

【问题讨论】:

    标签: tomcat maven packaging slf4j logback


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • “它将为部署到容器的所有应用程序替换它。”这实际上正是我想要的。
    • 好吧……在那种情况下。您必须将 所有 日志记录类(包括 slf4j)移动到 $CATALINA/lib
    • 确实如此。谢谢
    【解决方案2】:

    你尊重了吗

    将 slf4j-nop.jar、slf4j-simple.jar、slf4j-log4j12.jar、slf4j-jdk14.jar 或 logback-classic.jar 中的一个(也是唯一一个)放在类路径上应该可以解决问题。

    ?

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

    对我来说,它适用于 slf4j 和 log4j

    【讨论】:

      【解决方案3】:

      我们将 Slf4j 和 Logback 的所有 jar 放入 Tomcat 的 shared/lib 中。然后,我们将全局 logback.xml 放入 shared/classes 中。

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

      【讨论】:

        猜你喜欢
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 1970-01-01
        • 2018-12-12
        • 2015-02-04
        • 1970-01-01
        相关资源
        最近更新 更多