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

我目前正在开始一个新的Webapp(在tomcat 6上运行)我有使用slf4j的组件和使用commons日志记录的组件我计划使用log4j 2.0作为日志实现由于几个原因(主要用于appender: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)

我可以为哪个界面编写新类? loag4j还是slf4j?

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

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

把它们放在你的WAR中。

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

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

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

我正在使用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中有这个

     org.apache.log4j.* org.apache.commons.logging.* org.apache.commons.lang.* org.apache.commons.io.* org.apache.commons.collections4.* org.slf4j.*    true true  /cnfg  

请注意我没有使用Log4J 2.0,虽然我使用了Log4J 1.2的SLF4J。 话虽如此,我会回答你的问题如下:

  1. 程序到SLF4J。 它有一个漂亮,简单的API,这是您可能需要从日志记录框架中获得的所有内容。 另外,如果您出于某种原因决定要切换到logback或Log4J 1.2或其他任何而不是Log4J 2.0,您可以在后端切换出jar子。
  2. 绝对把jar子放在应用程序大战中。 您几乎不应该将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会引入所需的依赖项。