java web中使用log4j路径的事

第一次使用lo4j就出现一个很奇怪显现。log可以在java project项目下记录日志到控制台和文件中,且不需要额外代码量。但是放在web项目中,只有控制台有日志,文件都不生成的。为了解决这个问题花了我大半天时间,也尝试了网上各种方法,被坑无数。下面就来说说辛酸史的解决方法。

</pre><p></p><p><span style="font-size: 18px;">首先在web项目中log4j不记录文件日志原因是log4j.appender.log.File的属性配置成简单的相对路径。e.g:</span></p><pre name="code" class="html">log4j.appender.log.File = log/log.log
这样在web项目中容器无法获取路径,但是在控制台项目中可以实现文件记录。这里必须使用绝对路径!但是,web项目部署的时候使用绝对路径是非常麻烦的事情,虽然不是什么问题。我相信log4j这么好的东西不会不支持相对路径。经过一番斗争跳坑后,发现log4j可以在File属性配置时可以使用系统变量,格式:${xxx}. 经过测试有3中方式是有效解决该问题:

A .如果你用tomcat作为容器可以直接设置

log4j.appender.log.File=${catalina.home}/log/log.log
,这里借助tomcat容器现有的环境变量。非常简单,但是有所局限。

B. 该方法基于上面的log4j变量参数,但是不局限tomcat换下,需要自己写代码. 写一个servlet来配置log4j相关信息。主要有三步骤:

1. 还是配置下log4j.properties文件中File属性:

log4j.appender.log.File =${workPath}/log/log.log
. 这里workPath随便取名。但是要和2中设置系统变量一直。

2. servlet代码很简单这里贴写上(绝对有效),主要是servlet的init方法。 这里主要做了两件事:1.设置系统变量,把log4j.properties文件中workPath对应上;2.给log4j.properties文件加上该项目前缀,因为不加是无法获取的。既然加了项目根目录,那么log4j.properties文件放在项目哪里度可以,可以是web-inf下,也可是src下。

 public void init() throws ServletException {
  String file =this.getInitParameter("log4j");
  if(file != null){
	  System.setProperty("workePath",this.getServletContext().getRealPath("/"));
    String realPathString= this.getServletContext().getRealPath("/");
	  PropertyConfigurator.configure(realPathString+file);
  }
 }

3. servlet在xml中配置如下

<servlet>
         <servlet-name>log4jInit</servlet-name>
         <servlet-class>com.yhx.servlet.Log4jInit</servlet-class>
         <init-param>
           <param-name>log4j</param-name>
           <param-value>WEB-INF/classes/log4j.properties</param-value>
         </init-param>
         <load-on-startup>0</load-on-startup>
</servlet>

三个步骤完成就可以咯。这个方法相对独立,不会受到太多外在因素限制,但是要多动动手.

C. 该方法比较偷懒。由于我们项目使用spring框架,所以借着spring方便之路。

web.xml配置如下:

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

<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>120000</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

配置完成后不需要写任何多余代码就可以使用log4j.这里没有贴上webAppRootKey这个参数,默认是项目根目录,也可以自定义。因为spring会在log4j文件日志前面加上${webapp.root}前缀。这样日志文件默认情况下就放在项目根目录下。e.g:

log4j.appender.log.File = ${webapp.root}/log/Testlog.log


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页