Using Log4j 2 inWeb Applications
(在web应用中使用Log4j 2)
来源:http://logging.apache.org/log4j/2.x/manual/webapp.html
本文地址:http://blog.csdn.net/sushengmiyan/article/details/52390211
作者:苏生米沿
在JavaEE环境中使用log4j或者其它任何日志框架时,需要特别小心。当容器关闭或者应用程序卸载时日志资源的正常清除(数据库连接、文件流关闭等)是很重要的。由于web应用程序中类的加载特性,通过正常手段是不能清除Log4j资源的。Log4j必须在web应用部署的时候启动好,并且在应用程序卸载时要关闭掉。这种开关根据你应用程序是在Servlet3.0或者以上还是在servlet2.5中是区分的。
为了避免log4j的上述问题,当你引用log4j-web.jar的时候关闭钩子会自动禁用。
配置:
Log4j允许配置文件指定在web.xml中,使用log4jConfiguartion上下文参数。Log4j将会通过以下方式查找配置:
1. 如果有路径指定,那么它就会被搜索建立为servlet上下文资源。例如,如果log4jConfiguration包含了logging.xml,那么Log4j将会根据这个名字在web应用的root目录下查找文件。
2. 如果没有指定文件路径,log4j将会查找在WEB-INFO下以log4j2开头的文件。如果发现多个文件并且有一个是以应用名称命名的则使用该文件,否则,使用第一个查找到的。
3. 正常的搜索序列会再去查找classpath下和URLs定位到的配置文件。
Servlet3.0以及以上
一个servlet3.0及以上的web应用程序是指任何<web-app>的version是3.0或者更高的。当然,应用程序必须可以兼容在web容器中运行。比如有些:Tomcat7.0及更高,Glassfish3.0及更高,JBoss7.0及更高或者WebLogic12c及更高,WebSphere8.0及更高。
短故事
Log4j 2‘只工作在’servlet3.0或者更高的web应用中。它能够在应用程序启动时自动启动在应用关闭时自动卸载。多亏有servlet3.0中增加的ServletContainerInitializer API,相关联的Filter和ServletContextListener类可以在web应用中启动的时候动态的进行注册。
重要注意事项!考虑到性能问题,容器会自动把一些既定的jars忽略初始化,tomcat版本号小于7.0.43的会自动忽略log4j*.jar,导致上述特性不能正常工作,这个问题在7.0.43及以上版本中已经修复了。如果使用之前版本,请更改catalina.properties文件,并从jarsToSkip属性中将log4j*.jar移除,在其它容器中如果遇到类似事情,也需要做同样的事情。
Log4j2 Web JAR文件是一个web片段用来配置在其它web片段前的顺序。它包含了一个容器自动发现并初始化的ServletContainerInitializer(Log4jServletContainerInitializer),它将Log4jServletContextListener和Log4jServletFilter添加到ServletContext中。这些类初始化或者取消初始化Log4j的配置。
对于某些用户来说,自动启动Log4j是有问题的或者不受欢迎的。你可以使用isLog4jAutoInitializationDisabled参数来关闭自动启动。在web.xml中进行如下设置,即可自动取消启动。
<context-param>
<param-name>isLog4jAutoInitializationDisabled</param-name>
<param-value>true</param-value>
</context-param>
一旦你禁止自动初始化,你必须像Servlet2.5 web程序中那样进行初始化操作。而且必须要在其它的框架启动之前启动。
Servlet 2.5 web程序
只要是<web-app>中的version版本是2.5不管是否是在servlet3.0容器环境中就是2.5web程序。注意log4j2不支持2.4及以下版本的web程序。
在2.5中,需要自己定义启动参数,并且需要注意,都要放在其它的定义之前。如下:
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener<stener-class>
<stener>
<filter>
<filter-name>log4jServletFilter</filter-name>
<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log4jServletFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
<dispatcher>ASYNC</dispatcher><!-- Servlet 3.0 w/ disabled auto-initialization only; not supported in 2.5 -->
</filter-mapping>
你可以使用Log4jContextName、Log4jConfiguration、isLog4jContextSeletorNamed参数自定义listener和filter的行为。