如何同时使用log4j 2.0和slf4j以及Commons Logging

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

现在我的问题是: - 我应该将新课程编程到哪个界面?loag4j 还是 slf4j?甚至是公共日志记录?

  • 部署 jar 的最佳方式是什么?把它们放在我的应用程序大战中,还是把它们放到tomcat库里?

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


答案 1

我应该将新类编程到哪个界面?loag4j 还是 slf4j?

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

部署 jar 的最佳方式是什么?把它们放在我的应用程序大战中,还是把它们放到tomcat库里?

把它们放进你的战争中。

将 JAR 放在 Tomcat 库目录中的唯一原因 (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调用。然后,您需要选择一个框架,例如Logback。log4j-over-slf4j

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


答案 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中,我在weblogic中有这个.xml src/main/webapp/WEB-INF中

<?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>

推荐