天天看點

web項目中log4j的配置常用log4j配置

log4j是一個很好的開源的日志項目,下面就我在實際中使用的一些情況作一個小結(我所寫的是以spring為架構的運用,之是以要提到這點,是因為在spring中專門有處理log4j的地方,而我也用到了這些地方)。

  在使用的第一步你要明白你所釋出的web項目所使用的伺服器,因為不同的伺服器對于使用log4j是有些不同的,我在實際使用中主要是用tomcat和 jboss兩類,對于tomcat,它本身是沒有配置log4j的,是以使用起來和正常的一樣;而在jboss中它是本身配置了log4j的,是以有時候 我們在看項目代碼時,其整個項目并沒有log4j的配置檔案,而在一些類中仍然定義了Logger,例如static Logger log = org.apache.log4j.Logger.getLogger(UserDaoImple.class);,這就表明開發者打算使用jboss默 認的log4j的配置,我們可以在jboss下的對應的log目錄下的server.log中看到日志,jboss本身的log4j的配置是将 debug,info級的日志寫在server.log中,而像error等級别比較高的日志列印到控制台上,而寫到server.log中的日志比較 多,并不友善檢視。于是我們想到使用自己的log4j配置寫到某個具體的檔案中(注意檔案要先建立,才能忘裡面寫東西,log4j自己不能建立檔案),但 這裡因為jboss有它自己的log4j配置,是以如果我們配置的log4j包含Console的Appender時,就會出錯,錯誤類似于

ERROR: invalid console appender config detected, console stream is looping.

解決方法一是不用Console的Appender,或者改jboss的配置檔案,在jboss-service.xml檔案裡,把

<mbean code="org.jboss.logging.Log4jService" name="jboss.system:type=Log4jService,service=Logging">

        <attribute name="ConfigurationURL">resource:log4j.xml</attribute>

        <attribute name="CatchSystemOut">false</attribute>

        <attribute name="Log4jQuietMode">true</attribute>

</mbean>。

我建議不用Console的Appender,當然這是對jboss3.2.x是這樣,對于jboss4.0.x如果我們要用自己的log4j配置照上述改還是會有問題,會有類似于log4j:ERROR A "org.jboss.logging.util.OnlyOnceErrorHandler" object is not assignable to a "org.apache.log4j.spi.ErrorHandler" variable的異常,解決方法是把/server/default/jbossweb-tomcat55.sar/META-INF/jboss-service.xml 中的以下兩個熟悉改成true

<attribute name="Java2ClassLoadingCompliance">true</attribute> 

<attribute name="UseJBossWebLoader">true</attribute>

以上就是使用jboss伺服器可能出現的問題,解決了這些再來使用log4j就比較簡單了。

下面說說對于采用了spring架構的項目如何使用log4j,在spring中使用log4j,有些友善的地方,

1. 動态的改變記錄級别和政策,即修改log4j.properties,不需要重新開機Web應用,這需要在web.xml中設定一下。

2. 把log檔案定在 /WEB-INF/logs/ 而不需要寫絕對路徑。 

3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。

首先我們在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>60000</param-value> 

</context-param> 

<listener> 

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

</listener> 

其中第二部分就是能夠動态修改log4j.properties的關鍵,容器會每60秒掃描log4j的配置檔案 。對 于log4j的配置檔案如何寫,這就不多說了,大家可以去google,有一點就是我們如果用RollingFileAppender或者 FileAppender時,可以通過${webapp.root}來定位到伺服器的釋出的該項目下,這是spring把web目錄的路徑壓入到了 webapp.root的系統變量。然後,在log4j.properties 裡就可以這樣定義logfile位置 

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

如果有多個web應用,怕webapp.root變量重複,可以在context-param裡定義webAppRootKey。

當我們定義完log4j.properties後,剩下的就是在需要記錄的class中new 出Logger了 

常用log4j配置

常用log4j配置,一般可以采用兩種方式,.properties和.xml,下面舉兩個簡單的例子:

一、log4j.properties

### 設定org.zblog域對應的級别INFO,DEBUG,WARN,ERROR和輸出地A1,A2 ##

log4j.category.org.zblog=ERROR,A1 

log4j.category.org.zblog=INFO,A2 

log4j.appender.A1=org.apache.log4j.ConsoleAppender 

### 設定輸出地A1,為ConsoleAppender(控制台) ##

log4j.appender.A1.layout=org.apache.log4j.PatternLayout 

### 設定A1的輸出布局格式PatterLayout,(可以靈活地指定布局模式)##

log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n 

### 配置日志輸出的格式##

log4j.appender.A2=org.apache.log4j.RollingFileAppender 

### 設定輸出地A2到檔案(檔案大小到達指定尺寸的時候産生一個新的檔案)##

log4j.appender.A2.File=E:/study/log4j/zhuwei.html 

### 檔案位置##

log4j.appender.A2.MaxFileSize=500KB 

### 檔案大小##

log4j.appender.A2.MaxBackupIndex=1 

log4j.appender.A2.layout=org.apache.log4j.HTMLLayout 

##指定采用html方式輸出

二、log4j.xml

<?xml version="1.0" encoding="GB2312" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<appender name="org.zblog.all" class="org.apache.log4j.RollingFileAppender">

<!-- 設定通道ID:org.zblog.all和輸出方式:org.apache.log4j.RollingFileAppender -->

   <param name="File" value="E:/study/log4j/all.output.log" /><!-- 設定File參數:日志輸出檔案名 -->

   <param name="Append" value="false" /><!-- 設定是否在重新啟動服務時,在原有日志的基礎添加新日志 -->

   <param name="MaxBackupIndex" value="10" /> 

   <layout class="org.apache.log4j.PatternLayout">

       <param name="ConversionPattern" value="%p (%c:%L)- %m%n" /><!-- 設定輸出檔案項目和格式 -->

   </layout>

</appender>

<appender name="org.zblog.zcw" class="org.apache.log4j.RollingFileAppender">

   <param name="File" value="E:/study/log4j/zhuwei.output.log" />

   <param name="Append" value="true" />

   <param name="MaxFileSize" value="10240" /> <!-- 設定檔案大小 -->

   <param name="MaxBackupIndex" value="10" /> 

   <layout class="org.apache.log4j.PatternLayout">

       <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />

   </layout>

</appender>

<logger name="zcw.log"> <!-- 設定域名限制,即zcw.log域及以下的日志均輸出到下面對應的通道中 -->

   <level value="debug" /><!-- 設定級别 -->

   <appender-ref ref="org.zblog.zcw" /><!-- 與前面的通道id相對應 -->

</logger>

<root> <!-- 設定接收所有輸出的通道 -->

   <appender-ref ref="org.zblog.all" /><!-- 與前面的通道id相對應 -->

</root>

</log4j:configuration>

三、配置檔案加載方法:

import org.apache.log4j.Logger;

import org.apache.log4j.PropertyConfigurator;

import org.apache.log4j.xml.DOMConfigurator;

public class Log4jApp {

   public static void main(String[] args) {

       DOMConfigurator.configure("E:/study/log4j/log4j.xml");//加載.xml檔案

       //PropertyConfigurator.configure("E:/study/log4j/log4j.properties");//加載.properties檔案

       Logger log=Logger.getLogger("org.zblog.test");

       log.info("測試");

   }

}

四、項目使用log4j

在web 應用中,可以将配置檔案的加載放在一個單獨的servlet中,并在web.xml中配置該servlet在應用啟動時候加載。對于在多人項目中,可以給每一個人設定一個輸出通道,這樣在每個人在建構Logger時,用自己的域名稱,讓調試資訊輸出到自己的log檔案中。

五、常用輸出格式

# -X号:X資訊輸出時左對齊;

# %p:日志資訊級别

# %d{}:日志資訊産生時間

# %c:日志資訊所在地(類名)

# %m:産生的日志具體資訊

# %n:輸出日志資訊換行

Log4J 最佳實踐之全能配置檔案

給出得Log4J配置檔案實作了輸出到控制台,檔案,復原檔案,發送日志郵件,輸出到資料庫日志表,自定義标簽等全套功能。

log4j.rootLogger=DEBUG,CONSOLE,A1,im

#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE

log4j.addivity.org.apache=true

###################

# Console Appender

###################

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.Threshold=DEBUG

log4j.appender.CONSOLE.Target=System.out

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n

#####################

# File Appender

#####################

log4j.appender.FILE=org.apache.log4j.FileAppender

log4j.appender.FILE.File=file.log

log4j.appender.FILE.Append=false

log4j.appender.FILE.layout=org.apache.log4j.PatternLayout

log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

# Use this layout for LogFactor 5 analysis

########################

# Rolling File

########################

log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender

log4j.appender.ROLLING_FILE.Threshold=ERROR

log4j.appender.ROLLING_FILE.File=rolling.log

log4j.appender.ROLLING_FILE.Append=true

log4j.appender.ROLLING_FILE.MaxFileSize=10KB

log4j.appender.ROLLING_FILE.MaxBackupIndex=1

log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout

log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

####################

# Socket Appender

####################

log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender

log4j.appender.SOCKET.RemoteHost=localhost

log4j.appender.SOCKET.Port=5001

log4j.appender.SOCKET.LocationInfo=true

# Set up for Log Facter 5

log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout

log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n

########################

# Log Factor 5 Appender

########################

log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender

log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

########################

# SMTP Appender

#######################

log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender

log4j.appender.MAIL.Threshold=FATAL

log4j.appender.MAIL.BufferSize=10

[email protected]

log4j.appender.MAIL.SMTPHost=mail.hollycrm.com

log4j.appender.MAIL.Subject=Log4J Message

[email protected]

log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout

log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

########################

# JDBC Appender

#######################

log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender

log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test

log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver

log4j.appender.DATABASE.user=root

log4j.appender.DATABASE.password=

log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')

log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout

log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender

log4j.appender.A1.File=SampleMessages.log4j

log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'

log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout

###################

#自定義Appender

###################

log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender

log4j.appender.im.host = mail.cybercorlin.net

log4j.appender.im.username = username

log4j.appender.im.password = password

log4j.appender.im.recipient = [email protected]

log4j.appender.im.layout=org.apache.log4j.PatternLayout

log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n