我目前正在开始一个新的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)
答案 0 :(得分:22)
我可以为哪个界面编程我的新课程? loag4j还是slf4j?
如果您要使用SLF4J,请编程到该界面。它为底层日志记录实现提供了最大的灵活性。 slf4j的目的是成为一个可以编程的接口,所以将来如果你决定切换到logback,你将不必重写代码。
部署罐子的首选方式是什么?把它们放在我的应用程序大战中还是把它们放到tomcat库中?
将它们放入WAR中。
将JAR放入Tomcat libs目录的唯一原因(imo)是他们是否需要加载本机库。由于Java不允许您从两个不同的类加载器加载相同的本机库,因此您需要将其放在一个公共位置。但这不适用于此。
有些人认为lib目录是一种节省空间的方法。当“服务器级”机器具有1 GB的RAM时,这可能是有效的,但它已不再存在。避免使用lib
意味着您可以避免大多数难以调试的类加载问题。
我需要部署哪些罐子?
我假设您已经有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一起使用。话虽如此,我会回答你的问题如下:
lib
目录中。否则,它们将影响该应用程序服务器上的所有Web应用程序,而不仅仅是您的。此外,应用程序服务器的lib
目录中的jar无法通过部署Web应用程序来控制,但必须手动管理。slf4j-api-1.7.2.jar
,log4j-to-slf4j-2.0-beta4.jar
,log4j-2.0-beta4.jar
和log4j-core-2.0-beta4.jar
以及任何依赖项。如果你使用它,我肯定Maven会引入所需的依赖项。