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
log4j.appender.MAIL.From=chenyl@hollycrm.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@hollycrm.com
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 = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
posted on 2008-11-10 15:45
jiafang83 閱讀(17041)
評論(2) 編輯 收藏