log4j的xml輸出配置

原來一直使用log4j.properties,發現它比properties功能強大,可以配置輸出多個log文件。

log4j 有兩種配置方法,大家熟知的是properties文件但是最近的項目實施中,每次去用戶那裏裝系統,都要苦惱於log文件放在不同位置,要改property文件就要重打jar包,麻煩的緊。而如果採用 xml配置的方法,直接放在WEB-INFO下,要修改路徑,很方便。查了些資料,終於把系統的log4j改成在xml中配置啦。

附:log4j的API http://logging.apache.org/log4j/docs/api/index.html
log4i.xml 文件
<?xml version="1.0" encoding="GB2312" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="FILE"
class="org.apache.log4j.RollingFileAppender">
<!-- 設置通道file和輸出方式:org.apache.log4j.RollingFileAppender -->
<param name="File" value="D:/zhaotj/all.output.log" /><!-- 設置File參數:日誌輸出文件名 -->
<param name="Append" value="true" /><!-- 設置是否在重新啓動服務時,在原有日誌的基礎添加新日誌 -->
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" /><!-- 設置輸出文件項目和格式 -->
</layout>
</appender>

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<!-- 設置監視器輸出方式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%-4r [%t] %-5p %c %x - %m%n" />
</layout>
<!--濾鏡設置輸出的級別-->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="info" />
<param name="levelMax" value="info" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>

<root><!-- 設置接收所有輸出的通道 -->
<priority value="info" />
<appender-ref ref="FILE" /><!-- 與前面的通道id相對應 -->
<appender-ref ref="STDOUT" />
</root>

</log4j:configuration>

建好xml文件後 要寫一個servlet類繼承actionservlet,當工程初始化時自動加載xml配置文件
package com.asiainfo;
import javax.servlet.ServletException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.xml.DOMConfigurator;
import org.apache.struts.action.ActionServlet;

public class ExtendedActionServlet extends ActionServlet {
private Log log = LogFactory.getLog(this.getClass().getName());

public ExtendedActionServlet() {}

public void init() throws ServletException {
log.info(
"Initializing, My MyActionServlet init this System's Const Variable");
String prefix = this.getServletConfig().getServletContext().getRealPath(
"/");//讀取項目的路徑
String file = this.getServletConfig().getInitParameter("log4j");
//讀取log4j相對路徑
String filePath = prefix + file;
DOMConfigurator.configure(filePath);//加載.xml文件
log.info("Initializing, end My Init");
super.init();//應用了struts,此方法不能省,ActionServlet覆蓋了的此方法中有很多重要操作
}
}

我們可以看到 在此類中 用了相對路徑來加載xml的方法,首先通過prefix 讀取了項目的路徑然後再通過讀取web.xml中的log4j變量,獲得log4j.xml的相對路徑 兩者結合 就是他的絕對路徑拉
最後在web.xml中配置action信息 就可以實現加載啦
web.xml
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
com.asiainfo.ExtendedActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>

<!-- tsExtend -->
<init-param>
<param-name>config/tsextend</param-name><!--設備檢測子模塊-->
<param-value>
/WEB-INF/tsextend/struts-config.xml
</param-value>
</init-param>
<init-param>
<param-name>log4j</param-name><!--log4j.xml的路徑-->
<param-value>
/WEB-INF/log4j.xml
</param-value>
</init-param>
<init-param>
<param-name>info</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup><!--設置當工程初始時便執行-->
</servlet>

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

依據各個級別的日誌輸出到不同文件

log4j支持這個功能,不過不能再使用Properties配置,必須使用XML

建一個log4j.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= "STDOUT " class= "org.apache.log4j.ConsoleAppender ">
<layout class= "org.apache.log4j.PatternLayout "/>
</appender>
<appender name= "DEBUG " class= "org.apache.log4j.RollingFileAppender ">
<param name= "File " value= "debug.log "/>
<param name= "Append " value= "true "/>
<param name= "MaxFileSize " value= "500KB "/>
<param name= "MaxBackupIndex " value= "2 "/>
<layout class= "org.apache.log4j.PatternLayout "/>
<filter class= "org.apache.log4j.varia.LevelRangeFilter ">
<param name= "LevelMax " value= "DEBUG " />
<param name= "LevelMin " value= "DEBUG " />
</filter>
</appender>
<appender name= "INFO " class= "org.apache.log4j.RollingFileAppender ">
<param name= "File " value= "info.log "/>
<param name= "Append " value= "true "/>
<param name= "MaxFileSize " value= "500KB "/>
<param name= "MaxBackupIndex " value= "2 "/>
<layout class= "org.apache.log4j.PatternLayout "/>
<filter class= "org.apache.log4j.varia.LevelRangeFilter ">
<param name= "LevelMax " value= "INFO " />
<param name= "LevelMin " value= "INFO " />
</filter>
</appender>
<root>
<appender-ref ref= "STDOUT "/>
<appender-ref ref= "DEBUG "/>
<appender-ref ref= "INFO "/>
</root>
</log4j:configuration>


代碼中DOMConfigurator.configure( "log4j.xml ");


這樣就可以在log.debug和log.info時分別打印到不同文件中,如果你還需要更多的文件,可以複製多幾次appender就可以了
發佈了24 篇原創文章 · 獲贊 0 · 訪問量 2621
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章