【问题标题】:How to use log4j 2.0 and slf4j and Commons Logging together如何一起使用 log4j 2.0 和 slf4j 和 Commons Logging
【发布时间】:2023-03-31 06:21:01
【问题描述】:

我目前正在启动一个新的 Webapp(在 tomcat 6 上运行) 我有使用 slf4j 的组件和使用公共日志记录的组件 由于几个原因,我计划使用 log4j 2.0 作为日志实现(主要用于附加程序:SocketAppender 和 SyslogAppender,但也因为提升的配置重新加载而不会丢失日志事件)

现在我的问题是: - 我将我的新类编程到哪个接口? loag4j 还是 slf4j?甚至公共日志记录?

  • 部署 jar 的首选方法是什么?将它们放入我的应用程序战争中还是将它们放入 tomcat 库中?

  • 我需要部署哪些 jar? log4j(包括 slf4j 和 commons 绑定)、commons logging (slf4j-api-1.7.2.jar) 和 slf4j api (slf4j-api-1.7.2.jar)

【问题讨论】:

    标签: java logging slf4j apache-commons-logging log4j2


    【解决方案1】:

    我将我的新类编程到哪个接口? loag4j 还是 slf4j?

    如果您要使用 SLF4J,请编程到该界面。它为底层日志实现提供了最大的灵活性。 slf4j 的重点是成为一个您可以编程的接口,因此将来如果您决定切换到 logback,您将不必重写代码。

    部署 jar 的首选方式是什么?将它们放入我的应用程序战争中还是将它们放入 tomcat 库中?

    将它们放入您的 WAR 中。

    将 JAR 放在 Tomcat 库目录中的唯一原因 (imo) 是它们是否需要加载本机库。由于 Java 不允许您从两个不同的类加载器加载相同的本机库,因此您需要将 then 放在一个公共位置。但这不适用于这里。

    有些人认为 lib 目录是一种节省空间的方法。当“服务器级”机器有 1 GB 的 RAM 时,这可能是有效的,但现在不再适用了。避免lib 意味着您可以避免大多数难以调试的类加载问题。

    我需要部署哪些 jar?

    • slf4j-api 是基础 API
    • slf4j-log4j12 将实际日志记录路由到 Log4J
    • jcl-over-slf4j 拦截 Commons Logging 并通过 SLF4J 路由(到 Log4J)
    • log4j 将成为您的物理日志框架

    我假设您已经有 Log4J 的配置和/或可以轻松编写该配置。如果不是,并且您所关心的只是处理内部使用 Log4J 的代码,则有 log4j-over-slf4j,它将拦截 Log4J 调用。然后你需要选择一个框架,比如 Logback。

    (注意:我最初添加了所有这些包的链接,但没有足够的代表来发布它们。所以here's 一个指向 Maven 存储库的链接,突出显示了所有 SLF4J 包)

    【讨论】:

    • 1.好的 2. 据我所知,如果我将所有 jar 放入我的战争中,我的缺点是我不能在战争之外拥有日志配置,并且(通过自动更新)在运行时操纵配置。 (这可能更像是一个 tomcat/log4j_2.0 问题,我应该在单独的帖子中提出) 3. 因为我打算使用 log4j 2.0 我假设我需要 log4j-slf4j-impl.jar slf4j-log4j12.jar,这样对吗?
    • 没有使用 log4j 2.0,所以不确定你需要哪个实现 JAR。但这应该可以在 SLF4J 网站上找到。
    • 至于保持您的配置外部,以便您可以随时修改它:您仍然可以这样做,将 just 配置文件放在 lib 目录中(并且在战争)。它将通过 WAR 中的类路径扫描找到。但是,我更喜欢使用 JMX 来调整日志记录级别。 Log4J 1.2 中有一个 JMX bean,我希望 2.0 也有;如果您实例化它,它会向平台 JMX 提供程序注册自己,因此您可以使用 JConsole 之类的工具来访问它。
    • 这个方案不用log4j2,而是1.2。
    • slf4j-log4j12 使用 log4j 1.2 而不是 log4j 2.X。
    【解决方案2】:

    我正在使用 slf4j 和 log4j2 并使用

    slf4j-api-1.7.12.jar
    log4j-api-2.2.jar
    log4j-core-2.2.jar
    log4j-slf4j-impl-2.2.jar
    jcl-over-slf4j-1.7.12.jar(get rid of commons logging jars)
    

    如果您的应用服务器版本冲突,您可能需要使用某些供应商特定的类加载器设置来覆盖

    例如在 weblogic 12 c 中,我在 src/main/webapp/WEB-INF 内的 weblogic.xml 中有这个

    <?xml version="1.0" encoding="UTF-8"?>
    <weblogic-web-app 
    xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd 
    http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.5/weblogic-web-app.xsd">
    <container-descriptor>
        <prefer-application-packages>
            <package-name>org.apache.log4j.*</package-name>
            <package-name>org.apache.commons.logging.*</package-name>
            <package-name>org.apache.commons.lang.*</package-name>
            <package-name>org.apache.commons.io.*</package-name>
            <package-name>org.apache.commons.collections4.*</package-name>
            <package-name>org.slf4j.*</package-name>
        </prefer-application-packages>
    </container-descriptor>
    <jsp-descriptor>
        <keepgenerated>true</keepgenerated>
        <debug>true</debug>
    </jsp-descriptor>
    <context-root>/cnfg</context-root>
    </weblogic-web-app>
    

    【讨论】:

      【解决方案3】:

      请注意,我没有使用 Log4J 2.0,尽管我使用 SLF4J 和 Log4J 1.2。话虽如此,我将回答您的问题如下:

      1. 编程到 SLF4J。它有一个漂亮、简单的 API,它是您可能需要的日志框架的一切。另外,如果您出于某种原因决定要切换到 logback 或 Log4J 1.2 或其他任何版本而不是 Log4J 2.0,则只需切换后端的 jar。
      2. 一定要把罐子放在应用程序大战中。您几乎不应该将 jar 放入应用程序服务器的 lib 目录中。否则,它们将影响该应用程序服务器上的所有 Web 应用程序,而不仅仅是您的。此外,应用服务器的lib目录下的jars不能通过部署webapp来控制,必须手动管理。
      3. 看起来您需要slf4j-api-1.7.2.jarlog4j-to-slf4j-2.0-beta4.jarlog4j-2.0-beta4.jarlog4j-core-2.0-beta4.jar,以及任何依赖项。如果您使用它,我确信 Maven 会引入所需的依赖项。

      【讨论】:

      • 1.好的 2. 看我上面的评论:如果我想要一个外部(=不在战争中)日志配置,你建议改变吗? 3. 我假设我需要桥接/绑定 (log4j-slf4j-impl.jar) 而不是适配器 (log4j-to-slf4j.jar),正如@parsifal 提到的,我还需要 jcl-over-slf4j.jar (为了让我的公共日志库也通过 slf4j 登录到 log4j),这是正确的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2012-04-08
      相关资源
      最近更新 更多