如何使用log4j 2.0和slf4j以及Commons一起登录

时间:2013-02-26 17:50:53

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

我目前正在开始一个新的Webapp(在tomcat 6上运行) 我有使用slf4j的组件和使用commons日志记录的组件 我计划使用log4j 2.0作为日志实现,原因有多种(主要是对于appender:SocketAppender和SyslogAppender,还因为提升的配置重新加载而不丢失日志事件)

现在我的问题是: - 我可以为哪个界面编程我的新课程? loag4j还是slf4j?甚至是公共记录?

  • 部署广口瓶的首选方式是什么?把它们放在我的应用程序大战中还是把它们放到tomcat库中?

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

3 个答案:

答案 0 :(得分:22)

  

我可以为哪个界面编程我的新课程? loag4j还是slf4j?

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

  

部署罐子的首选方式是什么?把它们放在我的应用程序大战中还是把它们放到tomcat库中?

将它们放入WAR中。

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

有些人认为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。

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

答案 1 :(得分:7)

我正在使用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)

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

e.g。在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>

答案 2 :(得分:1)

请注意我没有使用Log4J 2.0,尽管我已经将SLF4J与Log4J 1.2一起使用。话虽如此,我会回答你的问题如下:

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