log4j.properties读取webapp.root值失败,导致的setFile(null,..)的解决方案

这个问题折磨了我整整一天,特此写出来帮助后来的小伙伴们少走弯路.

我先描述环境,你来看看是否和你的情况相似.

项目中使用了spring与log4j,使用org.springframework.web.util.Log4jConfigListener监听,log4j.properties中配置了${webapp.root}来获取web.xml中配置的webAppRootKey.大致相关代码如下:

web.xml:

<context-param>
 	<param-name>webAppRootKey</param-name>
 	<param-value>SzWeb.root</param-value>
</context-param>
<context-param>
 	<param-name>log4jConfigLocation</param-name>
 	<param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>
<context-param>
 	<param-name>log4jRefreshInterval</param-name>
 	<param-value>60000</param-value>
</context-param>
<listener>
 	<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>	  

log4j.properties:

log4j.appender.logfile_error.File=${webapp.root}/WEB-INF/logs/SystemError.log

网上流传导致setFile(null,..)的原因是

<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>

需要设置成classpath:log4j.properties

而在我的项目中,我发现的原因是:

listener的执行顺序导致的...

web.xml内的执行顺序是这样的 context-param-->listener-->filter-->servlet,而listener的执行顺序是按你书写顺序的...

我的项目中存在AB两个listener,Alistener在前,其中做了一些系统业务参数的初始化,Blistener就是Log4jConfigListener,本来是没什么问题的,但是A中偏偏有对日志的操作,所以在Blistener还没有生效前就要求log4j开始做日志处理,所以log4j同学就去找自己的配置文件,然后发现里面有一个${webapp.root},然后它就去system的property里面找,发现没有然后就报错...为什么没有呢?因为Blistener实际上去读取了servlet.realpath,然后把你设置的webAppRootKey和realpath关联起来,保存到system的property里面...结果B还没来得及干,A就去找了...

至此找到了原因...(之前google...度娘都问了...根本没有人和我一样,最终还是看了看Log4jConfigListener这玩意到底干了啥,然后才想起来可能是执行顺序导致的)

好了,完结撒花

时间: 2024-10-10 17:48:11

log4j.properties读取webapp.root值失败,导致的setFile(null,..)的解决方案的相关文章

java properties读取与设值

import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Enumeration;import java.util.HashMap;import java.ut

如何读取jar包外的properties文件和log4j.properties

http://jrails.iteye.com/blog/1705464 ***************************************' 一般在项目中使用properties配置文件的时候都将相关的properties文件放在src目录下,在将该app打包生成jar后,相应的properties配置文件生... 一般在项目中使用properties配置文件的时候都将相关的properties文件放在src目录下,在将该app打包生成jar后,相应的properties配置文件生

【配置】log4j.properties 详解与配置步骤

一.Log4j基本使用方法 Log4j由三个重要的组件构成:[日志信息的优先级],[日志信息的输出目的地],[日志信息的输出格式]. 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度: 日志信息的输出目的地指定了日志将打印到控制台还是文件中: 而输出格式则控制了日志信息的显示内容. 1.1.定义配置文件 其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境.但是,使用配置文件将使您的应用程序更加灵活.Log4j支持两种配置文件格

Log4j使用详解(log4j.properties格式)

Log4j使用详解(log4j.properties格式) 1.Log4j 的引入 在应用程序中添加日志记录总的来说基于三个目的: ① 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: ② 跟踪代码运行时轨迹,作为日后审计的依据: ③ 担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息. 最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的

spring log4j.properties 没有日志的问题

一.   log4j.properties 1. log4j.properties放在spring工程的src/main/rescours目录下无法读取. 测试后发现需要把log4j.properties文件放在src/main/webapp/WEB-INF目录下, 2. web.xml配置 <context-param>    <param-name>log4jConfigLocation</param-name>    <param-value>/WEB

log4j.properties文件的配置

Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置. 1.Loggers Loggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用

Log4j:log4j.properties 配置解析

Log4j 三个主要组件 Loggers(记录器):记录日志的工具,程序中就是用它来记录我们想要的日志信息. Appenders (输出源):日志输出到什么地方,可以是控制台.文件.流位置.数据库,等等. Layouts(布局模式):日志需要记录哪些基本信息,用什么样的格式去记录展示这些信息. 一个 Logger 最少要有一个 Appender,一个 Appender 有一个 Layout. Loggers 记录器在 Log4j 中就是 Logger 类的实例对象,下面是该类中定义的一些主要方法

【Log4j】 log4j.properties 使用

一.参数意义说明 输出级别的种类 ERROR.WARN.INFO.DEBUG ERROR 为严重错误 主要是程序的错误 WARN 为一般警告,比如session丢失 INFO 为一般要显示的信息,比如登录登出 DEBUG 为程序的调试信息 配置日志信息输出目的地 log4j.appender.appenderName = fully.qualified.name.of.appender.class org.apache.log4j.ConsoleAppender(控制台) org.apache.

LOG4J.PROPERTIES配置详解(转载)

Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境. 1. 配置文件Log4J配置文件的基本格式如下: #配置根Loggerlog4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …#配置日志信息输出目的地Appenderlog4j.appender.appenderName =