1. Jar包引入
maven項(xiàng)目在pom.xml中引入,并設(shè)置自動(dòng)導(dǎo)入
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.9</version>
</dependency>
或者手動(dòng)下載log4j的jar包,加入項(xiàng)目的依賴。
2. 使用
如果是測(cè)試項(xiàng)目,網(wǎng)上說直接把log4j.properties文件放在src文件夾下面就可以,但是我一直報(bào)錯(cuò)
log4j:WARN No appenders could be found for logger (log.GuavaCachDemo).
log4j:WARN Please initialize the log4j system properly.
查找原因,發(fā)現(xiàn)編譯后的文件里沒有l(wèi)og4j.properties文件,所以運(yùn)行時(shí)找不到配置文件,將該文件放置到編譯后的class文件的根目錄就可以了。
或者在程序中顯示的指明配置文件的位置也可以。
PropertyConfigurator.configure("src/log4j.properties");
在Web應(yīng)用中web.xml利用Spring配置log4j
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:config/log4j/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
程序?qū)嵗?/p>
package log;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class GuavaCachDemo {
public static void main(String[] args) {
// PropertyConfigurator.configure("src/log4j.properties");
Logger logger = Logger.getLogger(GuavaCachDemo.class);
logger.info("djsdjl");
}
}
3. 配置解析
1. 配置根Logger
語法為:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
level : 是日志記錄的優(yōu)先級(jí),分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級(jí)別。Log4j建議只使用四個(gè)級(jí)別,優(yōu)先級(jí)從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級(jí)別,可以控制到應(yīng)用程序中相應(yīng)級(jí)別的日志信息的開關(guān)。比如在這里定義了INFO級(jí)別,則應(yīng)用程序中所有DEBUG級(jí)別的日志信息將不被打印出來。appenderName:就是指定日志信息輸出到哪個(gè)地方。可以同時(shí)指定多個(gè)輸出目的地。例如:
log4j.rootLogger=info,A1,B2,C3
2. 配置日志信息輸出目的地
語法為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
"fully.qualified.name.of.appender.class" 可以指定下面五個(gè)目的地中的一個(gè):
- org.apache.log4j.ConsoleAppender(控制臺(tái))
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件)
- org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
1. ConsoleAppender選項(xiàng)
- Threshold=WARN:指定日志消息的輸出最低層次。
- ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
- Target=System.err:默認(rèn)情況下是:System.out,指定輸出控制臺(tái)
2. FileAppender 選項(xiàng)
- Threshold=WARN:指定日志消息的輸出最低層次。
- ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
- File=mylog.txt:指定消息輸出到mylog.txt文件。
- Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
3. DailyRollingFileAppender 選項(xiàng)
- Threshold=WARN:指定日志消息的輸出最低層次。
- ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
- File=mylog.txt:指定消息輸出到mylog.txt文件。
- Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
- DatePattern=''.''yyyy-ww:每周滾動(dòng)一次文件,即每周產(chǎn)生一個(gè)新的文件。當(dāng)然也可以指定按月、周、天、時(shí)和分。即對(duì)應(yīng)的格式如下:
- 1)''.''yyyy-MM: 每月
- 2)''.''yyyy-ww: 每周
- 3)''.''yyyy-MM-dd: 每天
- 4)''.''yyyy-MM-dd-a: 每天兩次
- 5)''.''yyyy-MM-dd-HH: 每小時(shí)
- 6)''.''yyyy-MM-dd-HH-mm: 每分鐘
4. RollingFileAppender 選項(xiàng)
- Threshold=WARN:指定日志消息的輸出最低層次。
- ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
- File=mylog.txt:指定消息輸出到mylog.txt文件。
- Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
- MaxFileSize=100KB: 后綴可以是KB, MB 或者是 GB. 在日志文件到達(dá)該大小時(shí),將會(huì)自動(dòng)滾動(dòng),即將原來的內(nèi)容移到mylog.log.1文件。
- MaxBackupIndex=2:指定可以產(chǎn)生的滾動(dòng)文件的最大數(shù)。
3. 配置日志信息的格式
其語法為:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
"fully.qualified.name.of.layout.class" 可以指定下面4個(gè)格式中的一個(gè):
- org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)
HTMLLayout 選項(xiàng)
LocationInfo=true:默認(rèn)值是false,輸出java文件名稱和行號(hào)
Title=my app file: 默認(rèn)值是 Log4J Log Messages.PatternLayout 選項(xiàng)
ConversionPattern=%m%n :指定怎樣格式化指定的消息。XMLLayout 選項(xiàng)
LocationInfo=true:默認(rèn)值是false,輸出java文件和行號(hào)
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
這里需要說明的就是日志信息格式中幾個(gè)符號(hào)所代表的含義:
- -X號(hào): X信息輸出時(shí)左對(duì)齊;
- %p: 輸出日志信息優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL,
- %d: 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
- %r: 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
- %c: 輸出日志信息所屬的類目,通常就是所在類的全名
- %t: 輸出產(chǎn)生該日志事件的線程名
- %l: 輸出日志事件的發(fā)生位置,相當(dāng)于%C.%M(%F:%L)的組合,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java:10)
- %x: 輸出和當(dāng)前線程相關(guān)聯(lián)的NDC(嵌套診斷環(huán)境),尤其用到像java servlets這樣的多客戶多線程的應(yīng)用中。
- %%: 輸出一個(gè)"%"字符
- %F: 輸出日志消息產(chǎn)生時(shí)所在的文件名稱
- %L: 輸出代碼中的行號(hào)
- %m: 輸出代碼中指定的消息,產(chǎn)生的日志具體信息
- %n: 輸出一個(gè)回車換行符,Windows平臺(tái)為"",Unix平臺(tái)為""輸出日志信息換行
可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對(duì)齊方式。如:
1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,默認(rèn)的情況下右對(duì)齊。
2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,"-"號(hào)指定左對(duì)齊。
3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大于30的話,就會(huì)將左邊多出的字符截掉,但小于30的話也不會(huì)有空格。
4)%20.30c:如果category的名稱小于20就補(bǔ)空格,并且右對(duì)齊,如果其名稱長(zhǎng)于30字符,就從左邊交遠(yuǎn)銷出的字符截掉
例子:
#控制臺(tái)輸出:
#log4j.rootLogger = INFO,consoleAppender
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold = ERROR
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern =%d %-5p %m %n
log4j.appender.consoleAppender.ImmediateFlush = true
# 直接輸出,不進(jìn)行緩存
log4j.appender.consoleAppender.Target = System.err
# 默認(rèn)是System.out方式輸出
#發(fā)送郵件:SMTPAppender
#log4j.rootLogger = INFO,MAIL
log4j.appender.MAIL = org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold = INFO
log4j.appender.MAIL.BufferSize = 10
log4j.appender.MAIL.From = yourmail@gmail.com
log4j.appender.MAIL.SMTPHost = smtp.gmail.com
log4j.appender.MAIL.Subject = Log4J Message
log4j.appender.MAIL.To = yourmail@gmail.com
log4j.appender.MAIL.layout = org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern =%d - %c -%-4r [%t] %-5p %c %x - %m %n
#數(shù)據(jù)庫:JDBCAppender
log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL = jdbc:oracle:thin:@ 210.51 . 173.94 : 1521 :YDB
log4j.appender.DATABASE.driver = oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.user = ydbuser
log4j.appender.DATABASE.password = ydbuser
log4j.appender.DATABASE.sql = INSERT INTO A1 (TITLE3) VALUES ( ' %d - %c %-5p %c %x - %m%n ' )
log4j.appender.DATABASE.layout = org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern =% d - % c -%- 4r [ % t] %- 5p % c % x - % m % n
#數(shù)據(jù)庫的鏈接會(huì)有問題,可以重寫org.apache.log4j.jdbc.JDBCAppender的getConnection() 使用數(shù)據(jù)庫鏈接池去得鏈接,可以避免insert一條就鏈接一次數(shù)據(jù)庫