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. LinkedHashMap简明

    LinkedHashMap 构造方法摘要 inkedHashMap() 构造一个带默认初始容量 (16) 和加载因子 (0.75) 的空插入顺序LinkedHashMap 实例. LinkedHash ...

  2. python3安装ibm_db

    在安装好python3之后,使用pip install ibm_db总是报错. 然后按照官方文档的说明添加了环境变量IBM_DB_HOME, 同时在命令行执行easy_install ibm_db就可 ...

  3. 学习React系列(九)——高阶函数

    定义:高阶组件就是一个函数,且该函数接收一个组件作为参数,并返回一个新的组件. (上一篇已经说过了高阶组件可以用来解决交叉问题) 一.不要改变原始组件,使用组合 class A extends Rea ...

  4. win10 jkd配置注意事项

    更换新的电脑预装win10家庭版,根据常规方法配置jdk8后运行javac提示:不是内部或外部命令,也不是可运行的程序或批处理文件. 1 设置变量classpath时前面有个点(完成这一步后javac ...

  5. Redis管理之持久化

    Redis的一大重要特征就是支持持久化. Redis提供了两种不同的持久化方式:RDB和AOF. RDB持久化可以在指定的时间间隔内生成数据集的快照.由于是定期的生成数据集的快照,所以,如果服务器出现 ...

  6. 使用Keras对交通标志进行分类

    # 使用Keras对交通标志进行分类 一.概述 本文主要记录的在使用Keras过程中,实现交通标志分类,数据集使用的是. 文本主要使用的环境为: Python3.5.2 Tensorflow 1.7 ...

  7. Conjugate

    1.1Conjugate问题描述在不存在的 noip day3 里,小 w ⻅到了一堆堆的谜题.比如这题为什么会叫共轭?他并不知道答案.有 n 堆谜题,每堆有 a i 个,小 w 每次从剩下的谜题中选 ...

  8. [HNOI2002]彩票

    题目描述 某地发行一套彩票.彩票上写有1到M这M个自然数.彩民可以在这M个数中任意选取N个不同的数打圈.每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同. 每次抽奖将抽出两个自然数X和Y.如果某人 ...

  9. 网络编程基础API

    1.预备知识 网络字节序 1.TCP/IP协议规定,网络数据流应采用大端字节序 0x12345678 小端存储:78存储在低地址 大端存储:12存储在低地址 网络字节序和主机字节序的转换 #inclu ...

  10. 【bzoj4568 scoi2016】幸运数字

    题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征. 一些旅行者希望 ...