解决问题(二)——Log4j

这些是昨天遇到的问题。主要解决问题是

1)启动Tomcat控制台每次都会有以下错误:

log4j:WARN No appenders could be found for logger (org.apache.struts.util.PropertyMessageResources).
log4j:WARN Please initialize the log4j system properly.

2)加入log4j.properties到环境中,log信息不能正确输入到文件中

对于问题1,经查过一些资料后,比较赞同的原因是log4j没有在actionServlet初始化之前初始化。我并没有确切的依据,赞同的原因是根据Tomcat启动时打出来的log信息判断,初始化顺序是最合理的解释。

看到一种解决方法就是自己写一个log4jInit的Servlet,代码如下:

import org.apache.log4j.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Log4jinit extends HttpServlet {
  public void init() {
    String prefix = getServletContext().getRealPath("/");
    String file = getInitParameter("log4j");
    if (file != null) {
      PropertyConfigurator.configure(prefix + file);
    }
  }
}

web.xml 的设置
<servlet>
    <servlet-name>log4j-init</servlet-name>
    <servlet-class>Log4j.Log4jinit</servlet-class>
    <init-param>
      <param-name>log4j</param-name>
      <param-value>WEB-INF/log4j.properties</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

但是在我的环境中并不生效。我采取的是另一种办法:

在web.xml加入如下代码:

<context-param>
 <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.xml</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>

说明:在上文的配置里,在上文的配置里,Log4jConfigListener会去WEB-INF/log4j.xml 读取配置文件;开一条watchdog线程每60秒扫描一下配置文件的变化(这样在web服务启动后再去修改配置文件也不用重新启动web服务了);并把web目录的路径压入一个叫webapp.root的系统变量(webapp.root将在log4j.xml文件中使用)。

用这段代码就解决了问题1,而且用这种方式可以随便更改配置文件的位置,不一定放在默认的工程的src下

问题2主要是log文件输出路径的问题。看了很多网上的信息都是说要写绝对路径,其实还有别的方法。

第一种方法是使用参数“${catalina.home}”举例:

log4j.appender.rollingFile.File=${catalina.home}/webapps/FullProject/WEB-INF/log/logInfo.log

catalina.home指的是Tomcat的安装目录,用这个和绝对路径相比灵活了一些,不过还是要自己添加几层目录,如例子上的/webapps/FullProject/, 但也不够灵活。

第二种方法是使用参数“${webapp.root}”,用MyEclipse deploy数据到Tomcat,所生成的war包就是放在webapps这个目录下面,足够灵活。不过对于其他web server是否支持这个参数并没有进行验证。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码匠君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值