工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2383|回复: 4

[原创]web应用中log4j的初始化配置的最佳实践

[复制链接]
发表于 2006-2-27 11:10 | 显示全部楼层 |阅读模式
在普通web项目中,可以书写如下xml配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<appender name="file.log" class="org.apache.log4j.RollingFileAppender">
<!-- 这里必须用绝对路径(或相对于tomcat的路径) -->
  <param name="File" value="c:\logs\myweb.log" />
  <param name="Append" value="false" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%C:%M()]-[%p] %m%n" />
  </layout>
</appender>

<appender name="console.log" class="org.apache.log4j.ConsoleAppender">
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%5p  (%F:%L) - %m%n" />
  </layout>
</appender>

<!--这里的name是要打印的包名,这里表示将org.woden模块中(包括子模块)的中间信息全部打印-->
<logger name="org.woden" additivity="false">
  <level value="DEBUG" />
  <appender-ref ref="console.log" />
  <appender-ref ref="file.log " />
</logger>

<!--这里root配置成fatal级别是防止打印出框架中的中间信息(解决了打印struts中间信息的问题)-->
<root>
  <level value="FATAL" />
  <appender-ref ref="console.log" />
  <appender-ref ref="file.log " />
</root>
</log4j:configuration>

然后自己写一个Servlet,命名为Log4jInit,代码如下:

package org.woden.controller.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.xml.DOMConfigurator;

public class Log4jInit extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
  super.init(config);
  String prefix = getServletContext().getRealPath("/");
  String file = getInitParameter("log4j");
  System.out.println("--------  Log4J Start  --------- ");
  if (file != null) {
   DOMConfigurator.configure(prefix + file);
  }
}

protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
}
}

然后在web.xml中配置Servlet启动:

<servlet>
  <servlet-name>MyLog4jInit</servlet-name>
  <servlet-class>org.woden.controller.servlet.Log4jInit</servlet-class>
  <init-param>
   <param-name>log4j</param-name>
   <param-value>WEB-INF/log4j.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

注意:启动级别最好设小点,表示更快启动.一些IDE一般把struts(Action)启动级别设成了3或2,最好把log4j的启动放到struts之前.



另外,在spring框架中对log4j进行了增强:
首先不需要自己写servlet来启动log4j,而是直接用spring的Log4jConfigListener监听器.这样做有几个好处,最大的好处就是不用重启web应用也可以改变log4j的级别(和策略).而且spring允许将log文件放到项目的相对目录中.

spring中在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><!--60秒扫描一次-->
</context-param>
<listener>
  <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

在log4j的配置文件中,进行相应修改:
<param name="File" value="${webapp.root}/WEB-INF/logs/test.log " /><!--将log文件放到项目相对目录中-->

(the end)

本文系参考了CSDN多篇文章后进行的总结,经验上并非原创,特此声明.
 楼主| 发表于 2006-3-8 00:54 | 显示全部楼层
好怀念hjack...这个帖子都没人来顶...如果你在的话你肯定会顶...
回复

使用道具 举报

发表于 2006-3-11 11:52 | 显示全部楼层
顶一下,

wool辛苦嘞

我现在实在很忙,没时间逛论坛嘞.

加油...
回复

使用道具 举报

 楼主| 发表于 2006-3-11 12:08 | 显示全部楼层
我现在白天上班,,,晚上泡后院...呵呵...

楼上的为Q友的未来努力啊...
回复

使用道具 举报

发表于 2006-3-12 11:14 | 显示全部楼层
我来顶一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-15 01:38

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表