天天看點

[Java開發之路](16)學習log4j日志

1. 建立一個java工程,導入jar包(log4j-1.2.17.jar)

[Java開發之路](16)學習log4j日志

jar包下載下傳位址:點選打開連結

2. 配置檔案:建立并設定log4j.properties

<code># 設定</code>

<code>log4j.rootlogger = debug,stdout,d,e</code>

<code> </code>

<code># 輸出資訊到控制台</code>

<code>log4j.appender.stdout = org.apache.log4j.consoleappender</code>

<code>log4j.appender.stdout.target = system.out</code>

<code>log4j.appender.stdout.layout = org.apache.log4j.patternlayout</code>

<code># 輸出格式</code>

<code>log4j.appender.stdout.layout.conversionpattern = [%-5p] %d{yyyy-mm-dd hh:mm:ss, sss} method:%l%n%m%n</code>

<code># 輸出debug 級别以上的日志到d://workspace/logs/debug.log</code>

<code>log4j.appender.d = org.apache.log4j.dailyrollingfileappender</code>

<code>log4j.appender.d.file = d://workspace/logs/debug.log</code>

<code>log4j.appender.d.append = true</code>

<code>log4j.appender.d.threshold = debug</code>

<code>log4j.appender.d.layout = org.apache.log4j.patternlayout</code>

<code># 列印debug資訊格式</code>

<code>log4j.appender.d.layout.conversionpattern = %-d{yyyy-mm-dd hh:mm:ss} [ %t:%r ] - [ %p ] %m%n</code>

<code># 輸出error 級别以上的日志到=d://workspace/logs/error.log</code>

<code>log4j.appender.e = org.apache.log4j.dailyrollingfileappender</code>

<code>log4j.appender.e.file =d://workspace/logs/error.log</code>

<code>log4j.appender.e.append = true</code>

<code>log4j.appender.e.threshold = error</code>

<code>log4j.appender.e.layout = org.apache.log4j.patternlayout</code>

<code># 列印error資訊格式</code>

<code>log4j.appender.e.layout.conversionpattern = %-d{yyyy-mm-dd hh:mm:ss} [ %t:%r ] - [ %p ] %m%n</code>

3. 使用日志

<code>package com.qunar.sjf;</code>

<code>import org.apache.log4j.logger;</code>

<code>public class importmost {</code>

<code>private static logger logger = logger.getlogger(importmost.class);</code>

<code></code>

<code>public static void main(string[] args) {</code>

<code>// debug級别的資訊</code>

<code>logger.debug("this is a debug");</code>

<code>// info級别的資訊</code>

<code>logger.info("this is a info");</code>

<code>// error級别的資訊</code>

<code>logger.error("this is a error");</code>

<code>}</code>

4. 輸出資訊

4.1 控制台輸出資訊

[debug] 2016-01-13 20:55:05, 622 method:com.qunar.sjf.importmost.main(importmost.java:10)

this is a debug

[info ] 2016-01-13 20:55:05, 627 method:com.qunar.sjf.importmost.main(importmost.java:12)

this is a info

[error] 2016-01-13 20:55:05, 628 method:com.qunar.sjf.importmost.main(importmost.java:14)

this is a error

4.2 背景日志

error.log:

2016-01-13 20:55:05  [ main:6 ] - [ error ]  this is a error

debug.log:

2016-01-13 20:55:05  [ main:0 ] - [ debug ]  this is a debug

2016-01-13 20:55:05  [ main:5 ] - [ info ]  this is a info

5. logger方法

logger類提供了多種方法來處理日志活動。 logger類不允許執行個體化一個新執行個體,但它可以通過兩個靜态方法獲得一個 logger 對象:

<code>public static logger getrootlogger();</code>

<code>public static logger getlogger(string name);</code>

<code>public static logger getlogger(class clazz);</code>

第一個方法傳回根日志記錄器,第二個方法根據給定額參數name檢索日志記錄器,第三個方法根據給定的class對象傳回日志記錄器。

logging 方法:

我們得到了一個日志記錄器之後,可以使用日志記錄器的幾種方法來記錄消息。 logger類有專門用于列印日志資訊方法。

方法

描述

public void debug(object message)

列印使用 level.debug 消息級别

public void error(object message)

列印使用 level.error 消息級别

public void fatal(object message)

列印使用 level.fatal 消息級别

public void info(object message)

列印使用 level.info 消息級别

public void warn(object message)

列印使用 level.warn 消息級别

public void trace(object message)

列印使用level.trace消息級别

所有的級别定義在org.apache.log4j.level類中,并且任何上述方法都可以調用如下:

6. 日志級别

org.apache.log4j.level類提供以下級别,但也可以通過level類的子類自定義級别。

級别

all

最低級别,打開所有日志級别

debug

細粒度資訊事件,對應用程式調試最有用

error

錯誤事件,可能仍然允許應用程式繼續運作

fatal

非常嚴重的錯誤事件,這可能導緻應用程式中止

info

指定能夠突出在粗粒度級别的應用程式運作情況的資訊的消息

off

最進階别,關閉日志記錄

trace

細粒度比debug更低的資訊事件

warn

具有潛在危害的情況

對于标準級别關系如下:all &lt; debug &lt; info &lt; warn &lt; error &lt; fatal &lt; off。all是最低級别,off是最進階别。

如果設定日志級别為a,則在記錄日志時日志級别b可以啟用,必須滿足b &gt;= a這一條件。

下面的例子明确指出如何可以過濾所有的debug和info消息。這個程式使用記錄并執行setlevel(level.x)方法來設定所需的日志記錄級别:

<code>import org.apache.log4j.level;</code>

<code>// 設定日志記錄器級别</code>

<code>logger.setlevel(level.warn);</code>

<code>// 日志資訊</code>

<code>logger.trace("trace message!");</code>

<code>logger.debug("debug message!");</code>

<code>logger.info("info message!");</code>

<code>logger.warn("warn message!");</code>

<code>logger.error("error message!");</code>

<code>logger.fatal("fatal message!");</code>

運作結果:

[warn ] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.importmost.main(importmost.java:15)

warn message!

[error] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.importmost.main(importmost.java:16)

error message!

[fatal] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.importmost.main(importmost.java:17)

fatal message!

7. 日志格式化

apache log4j提供了各種布局對象,每一個對象都可以根據各種布局格式記錄資料。在層次結構中的頂級類是抽象類是org.apache.log4j.layout,是所有其他布局類的基類。由于是抽象類,我們分不能直接使用layout,而是使用layout的子類。

(1)datelayout

(2)htmllayout

(3)patternlayout

(4)simplelayout

(5)xmllayout

format()

将loggingevent類中的資訊格式化成一行日志。

getcontenttype()

定義日志檔案的内容類型,目前在log4j中隻是在smtpappender中用到,用于設定發送郵件的郵件内容類型。而layout本身也隻有htmllayout實作了它。

getheader()

定義日志檔案的頭,目前在log4j中隻是在htmllayout中實作了它。

getfooter()

定義日志檔案的尾,目前在log4j中隻是htmllayout中實作了它。

ignoresthrowable()

定義目前layout是否處理異常類型。在log4j中,不支援處理異常類型的有:ttclayout、patternlayout、simplelayout。

7.1 htmllayout

如果想生成一個html格式的日志檔案,可以使用htmllayout 布局格式。htmllayout類擴充抽象org.apache.log4j.layout類,并覆寫其基類的 format()方法來提供html樣式格式。

這提供了以下資訊顯示:

生成特定的日志事件之前,從應用程式的開始所經過的時間(time)

調用該記錄請求的線程的名稱(thread)

與此記錄請求相關聯的級别(level)

日志記錄器(logger)和記錄消息的名稱(message)

可選程式檔案的位置資訊,并從其中記錄被調用的行号(category 和 line)

void setcontenttype(string)

設定 html 的内容類型,預設為 text/html

void setlocationinfo(string)

設定日志事件的位置資訊(所在目錄,所在行數等)。

void settitle(string)

設定 html 檔案的标題,預設為 log4j log messages。

執行個體:

<code>package com.qunar.log;</code>

<code>public class htmllayoutdemo {</code>

<code>// 日志記錄器</code>

<code>private static logger logger = logger.getlogger(htmllayoutdemo.class);</code>

<code>logger.debug("this is an debug message");</code>

<code>logger.info("this is an info message");</code>

配置檔案:

<code># define the root logger with appender file</code>

<code>log = d://workspace/logs/</code>

<code>log4j.rootlogger = debug, file</code>

<code># define the file appender</code>

<code>log4j.appender.file=org.apache.log4j.fileappender</code>

<code>log4j.appender.file.file=${log}htmllayoutdemo.html</code>

<code># define the layout for file appender</code>

<code>log4j.appender.file.layout=org.apache.log4j.htmllayout</code>

<code>log4j.appender.file.layout.title=html layout demo</code>

<code>log4j.appender.file.layout.locationinfo=true</code>

日志輸出:

[Java開發之路](16)學習log4j日志

7.2 patternlayout

如果您希望基于某種模式生成特定格式的日志資訊,可使用 org.apache.log4j.patternlayout 格式化您的日志資訊。patternlayout 繼承自抽象類 org.apache.log4j.layout,覆寫了其 format() 方法,通過提供的模式,來格式化日志資訊。

設定轉換模式,預設為 %r [%t] %p %c %x - %m%n。

下面的表格解釋了上面模式中用到的字元,以及所有定制模式時能用到的字元:

模式字元

含義

c

為輸出的日志事件分類,比如對于分類 "a.b.c",模式 %c{2} 會輸出 "b.c" 。

輸出發起記錄日志請求的類的全名。比如對于類 "org.apache.xyz.someclass",模式 %c{1} 會輸出 "someclass"。

d

輸出記錄日志的日期,比如 %d{hh:mm:ss,sss} 或 %d{dd mmm yyyy hh:mm:ss,sss}。

f

輸出檔案名。

l

輸出生成日志的調用者的位置資訊。

輸出發起日志請求的行号。

m

輸出和日志事件關聯的,由應用提供的資訊。

輸出發起日志請求的方法名。

n

輸出平台相關的換行符。

p

輸出日志事件的優先級。

r

輸出從建構布局到生成日志事件所花費的時間,以毫秒為機關。

t

輸出生成日志事件的線程名。

x

輸出和生成日志事件線程相關的 ndc (嵌套診斷上下文)。

該字元後跟 mdc 鍵,比如 x{clientip} 會輸出儲存在 mdc 中鍵 clientip 對應的值。

%

百分号, %% 會輸出一個 %。

預設情況下,資訊保持原樣輸出。但是借助格式修飾符的幫助,就可調整最小列寬、最大列寬以及對齊。

格式修飾符

左對齊

最小寬度

最大寬度

%20c

20

如果列名少于 20 個字元,左邊使用空格補齊(右對齊)

%-20c

如果列名少于 20 個字元,右邊使用空格補齊(左對齊)。

%.30c

不适用

30

如果列名長于 30 個字元,從開頭去除。

%20.30c

如果列名少于 20 個字元,左邊使用空格補齊(右對齊);

%-20.30c

如果列名少于 20 個字元,右邊使用空格補齊(左對齊);

<code>public class patternlayoutdemo {</code>

<code>private static logger logger = logger.getlogger(patternlayoutdemo.class);</code>

<code># 日志存儲位置</code>

<code>log4j.appender.file.file=d:/workspace/logs/log.out</code>

<code># 追加方式寫入檔案</code>

<code>log4j.appender.file.append=true</code>

<code># 日志布局方式</code>

<code>log4j.appender.file.layout=org.apache.log4j.patternlayout</code>

<code># 日志格式</code>

<code>log4j.appender.file.layout.conversionpattern=%d{yyyy-mm-dd}-%t-%x-%-p-%-10c-%n%m%n</code>

日志輸出 log.out:

2016-01-16-main--debug-com.qunar.log.patternlayoutdemo-

this is an debug message

2016-01-16-main--info-com.qunar.log.patternlayoutdemo-

this is an info message

8. 日志寫到檔案

8.1 fileappender

日志記錄到檔案中,主要用到fileappender類。fileappender繼承自writerappender。

fileappender配置:

屬性

immediateflush

預設設定為true,表示所有消息都會被立即輸出,設為false則不輸出

encoding

編碼格式。它可以使用任何字元編碼。預設情況下是特定于平台的編碼方案

threshold

寫入檔案的日志級别。

filename

日志檔案名稱。

append

預設設定為true,以追加的方式把日志寫入檔案。

bufferedio

預設設定為false,表示是否需要寫入緩存啟用。

buffersize

預設設定為8kb,如果 bufferedi/o 啟用,表示緩沖區的大小,

<code># 表示所有消息都會被立即輸出,設為false則不輸出</code>

<code>log4j.appender.file.immediateflush=true</code>

<code># 寫入的日志級别</code>

<code>log4j.appender.file.threshold=info</code>

日志輸出(注意:隻有輸出info資訊  與配置檔案設定有關):

8.2 rollingfileappender

當想要寫日志資訊轉化多個檔案要求一樣,例如,如果檔案大小達到一定的門檻值等。

寫日志記錄資訊分成多個檔案,必須擴充fileappender類,并繼承其所有屬性org.apache.log4j.rollingfileappender類。有以下除了已如上所述為 fileappender 可配置參數:

maxfilesize

預設值是10mb,檔案的復原臨界尺寸。

maxbackupindex

預設值是1,建立的備份檔案的數量。

<code>for(int i = 0;i &lt; 15;++i){</code>

<code>logger.debug("this is an debug message:" + i);</code>

<code>}//for</code>

<code>log4j.appender.file=org.apache.log4j.rollingfileappender</code>

<code># 日志復原最大值</code>

<code>log4j.appender.file.maxfilesize=1kb</code>

<code># 日志檔案備份個數</code>

<code>log4j.appender.file.maxbackupindex=1</code>

此示例配置說明每個日志檔案的最大值為1kb。最開始建立日志檔案log.out,當超過日志檔案最大值時,log.out.1新的日志檔案将被建立。同時,log.out中的日志轉移到log.out.1中(備份檔案設定為1)。log.out日志檔案永遠寫入最新日志。

[Java開發之路](16)學習log4j日志
[Java開發之路](16)學習log4j日志
[Java開發之路](16)學習log4j日志
[Java開發之路](16)學習log4j日志

8.3 dailyrollingfileappender

如果想它能夠按一定的時間頻率滾動日志記錄檔案,以保持日志記錄資訊的良好記錄,就必須它擴充fileappender類,并繼承其所有屬性useorg.apache.log4j.dailyrollingfileappender類。

在dailyrollingfileappender中可以指定monthly(每月)、 weekly(每周)、daily(每天)、half-daily(每半天)、hourly(每小時)和minutely(每分鐘)六個頻度,這是通過為 datepattern選項賦予不同的值來完成的。datepattern選項的有效值為:

datepattern屬性

'.'yyyy-mm

對應monthly(每月)

'.'yyyy-ww

對應weekly(每周)

'.'yyyy-mm-dd

對應daily(每天)

'.'yyyy-mm-dd-a

對應half-daily(每半天)

'.'yyyy-mm-dd-hh

對應hourly(每小時)

'.'yyyy-mm-dd-hh-mm

對應minutely(每分鐘)

datepattern中不用處理的文字要放到單引号(')中,如上面的(.)。如果您對此有疑問可以查閱simpledateformat的文檔。dailyrollingfileappender中使用這個類來處理datepattern。

日志檔案輸出結果:

[Java開發之路](16)學習log4j日志

9. 日志輸出到資料庫中

log4j api提供 org.apache.log4j.jdbc.jdbcappender 對象,它能夠将日志資訊在指定的資料庫。

driver

設定驅動程式類為指定的字元串。如果沒有指定驅動程式類,預設為sun.jdbc.odbc.jdbcodbcdriver

url

設定jdbc url

layout

設定要使用的布局。預設布局org.apache.log4j.patternlayout

user

資料庫使用者名

password

資料庫密碼

sql

指定sql語句在每次記錄事件發生的時間執行。這可能是insert,update或delete

設定緩沖區的大小。預設大小為1

資料庫設定:

建立存儲日志的表:

<code>create table logs</code>

<code>(id varchar(20) not null,</code>

<code>time date not null,</code>

<code>logger varchar(50) not null,</code>

<code>level varchar(10) not null,</code>

<code>message varchar(1000) not null</code>

<code>);</code>

[Java開發之路](16)學習log4j日志

日志配置檔案:

<code>log4j.rootlogger = debug, db</code>

<code>log4j.appender.db=org.apache.log4j.jdbc.jdbcappender</code>

<code># url連結</code>

<code>log4j.appender.db.url=jdbc:mysql://localhost/test</code>

<code># 驅動</code>

<code>log4j.appender.db.driver=com.mysql.jdbc.driver</code>

<code># 使用者名</code>

<code>log4j.appender.db.user=root</code>

<code># 密碼</code>

<code>log4j.appender.db.password=root</code>

<code># 日志插入資料庫 %d 日期 %c 類名 %p 優先級 %m 日志資訊</code>

<code>log4j.appender.db.sql=insert into logs values('%t','%d{yyyy-mm-dd}','%c','%p','%m')</code>

<code>log4j.appender.db.layout=org.apache.log4j.patternlayout</code>

程式檔案:

<code>public class jdbcappenderdemo {</code>

<code>private static logger logger = logger.getlogger(jdbcappenderdemo.class);</code>

<code>for(int i = 0;i &lt; 5;++i){</code>

<code>logger.debug("this is an debug message:" + i);</code>

必須添加mysql的驅動jar包:點選打開連結

[Java開發之路](16)學習log4j日志