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的行为。

在web应用中使用Log4j 2的更多相关文章

  1. web.xml中配置log4j

    1.将 commons-logging.jar和 log4j.jar加入你的项目中:2.在src/下创建log4j.properties|log4j.xml文件:3.在web.xml中配置log4j的 ...

  2. 3.Web项目中使用Log4j实例

    转自:https://blog.csdn.net/luohai859/article/details/52250807 上面代码描述了Log4j的简单应用,其实使用Log4j也就是这样简单方便.当然除 ...

  3. 在web项目中配置log4j

    在web.xml中添加如下代码 <context-param> <param-name>contextConfigLocation</param-name> < ...

  4. Web.xml 中增加log4j

    配置文件例如以下.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...

  5. 在Spring项目中使用Log4j记录日志

    (1)引入log4j的jar包: 官网下载地址:http://logging.apache.org/log4j/1.2/download.html (2)在web.xml中添加log4j配置: 1 2 ...

  6. java web中使用log4j

    测试log4j的项目结构 Log4j.properties的路径为    src/config/log4j Log4j.properties文件的内容 下面定义日志输出级别是 INFO,并且配置了2个 ...

  7. 在java项目中使用log4j的实例

    测试log4j的项目结构 Log4j.properties的路径为    src/config/log4j Log4j.properties文件的内容 下面定义日志输出级别是 INFO,并且配置了2个 ...

  8. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  9. 在JavaWeb中使用Log4j步骤

    在JavaWeb中使用Log4J指南.每次在开始写一个项目的时候都忘记Log4J如何配置.所以写个步骤,作为记录. 第一步 下载Log4J jar包 从Apache Logging Services ...

随机推荐

  1. SpringBoot: 配置加载顺序

    在应用程序中各种配置是不可避免的,Spring中对配置的抽象(Environment)可以说是达到了极致,其中有一项尤为突出:PropertySource(配置来源),配置来源通常包括命令行参数,系统 ...

  2. Hibernate注解用法

    @NotNull 适用于基本类型,任何对象的value不能为null. @NotBlank 适用于String类型,只能用于字符串不为null,并且字符串trim()以后length要大于0 @Not ...

  3. [LeetCode] Boundary of Binary Tree 二叉树的边界

    Given a binary tree, return the values of its boundary in anti-clockwise direction starting from roo ...

  4. Multipath在OpenStack中的faulty device的成因及解决(part 2)

    | 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 简介 在上次的文章M ...

  5. 【USACO11NOV】牛的阵容Cow Lineup 尺取法+哈希

    题目描述 Farmer John has hired a professional photographer to take a picture of some of his cows. Since ...

  6. 【bzoj4008 hnoi2015】 亚瑟王

    题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能 ...

  7. ●BZOJ 1069 [SCOI2007]最大土地面积

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1069 题解: 计算几何,凸包,旋转卡壳 其实和这个题差不多,POJ 2079 Triangl ...

  8. 51Nod 1196 字符串的数量

    用N个不同的字符(编号1 - N),组成一个字符串,有如下要求: (1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符.如果不作为结尾字符而是中间的字符,则该字符后面可以 ...

  9. hdu 1394 线段树

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  10. 根据构建类型自动修改依赖库的BuildConfig.DEBUG的值

    app模块引用了library,在library模块中控制日志输出使用的是 if (BuildConfig.DEBUG) { logger.d("print %s", msg); ...