16

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

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

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

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

4

3 回答 3

23

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

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

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

把它们放在你的 WAR 中。

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

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

我需要部署什么罐子?

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

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

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

于 2013-02-26T18:40:18.800 回答
8

我正在使用 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>
于 2015-06-05T16:01:35.730 回答
1

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

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