Java日志軟件Log4j的基本使用教程
1.概述
1.1背景
在我們的日常開發(fā)中,日志記錄非常重要。在應(yīng)用程序中添加日志記錄總的來說基于三個(gè)目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析工作;跟蹤代碼運(yùn)行時(shí)軌跡,作為日后審計(jì)的依據(jù);擔(dān)當(dāng)集成開發(fā)環(huán)境中的調(diào)試器的作用,向文件或控制臺(tái)打印代碼的調(diào)試信息。
1.2簡介
Log4j(log for java)是Apache的一個(gè)開放源代碼項(xiàng)目,它提供了一種細(xì)膩的日志管理方式。通過一個(gè)配置文件,我們可以多選擇的控制每條日志的輸出格式和目的地。通過定義信息的級別,我們也可以靈活開關(guān)代碼中的反饋信息。簡單的說log4j就是幫助開發(fā)人員進(jìn)行日志輸出管理的API類庫。它最重要的特點(diǎn)就可以配置文件靈活的設(shè)置日志信息的優(yōu)先級、日志信息的輸出目的地以及日志信息的輸出格式。
2.log4j配置
2.1log4j的類圖
- Logger -日志寫出器,供程序員輸出日志信息
- Appender -日志目的地,把格式化好的日志信息輸出到指定的地方去
- ConsoleAppender -目的地為控制臺(tái)的Appender
- FileAppender -目的地為文件的Appender
- RollingFileAppender -目的地為大小受限的文件的Appender
- Layout -日志格式化器,用來把程序員的logging request格式化成字符串
- PatternLayout -用指定的pattern格式化logging request的Layout
2.2定義配置文件
Log4j可以通過java程序動(dòng)態(tài)設(shè)置,該方式明顯缺點(diǎn)是:如果需要修改日志輸出級別等信息,則必須修改java文件,然后重新編譯,很是麻煩。
使用配置文件將使我們的應(yīng)用程序更加靈活配置log,日志輸出方式包括輸出優(yōu)先級、輸出目的地、輸出格式。Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件log4j.properties(鍵=值)。
- n xml文件
- n properties文件(推薦使用)
2.3配置文件log4j.properties
在第一次調(diào)用到Log4J時(shí),Log4J會(huì)在類路徑(../web-inf/class/當(dāng)然也可以放到其它任何目錄,只要該目錄被包含到類路徑中即可)中定位這個(gè)文件,并讀入這個(gè)文件完整的配置。這個(gè)配置文件告訴Log4J以什么樣的格式、把什么樣的信息、輸出到什么地方。相應(yīng)的,我們需要配置3個(gè)方面的內(nèi)容:
1、根目錄(級別和目的地);
2、目的地(控制臺(tái)、文件等等);
3、輸出樣式(何種方式顯示日志內(nèi)容)
示例如下:
#設(shè)置日志輸出級別
log4j.rootLogger=debug,appender1
#輸出到控制臺(tái)
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#樣式為TTCCLayout
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
2.4.log4j三組件說明
Log4j有三個(gè)主要的組件:Loggers(記錄器),Appender (輸出源)和Layout(布局)。綜合使用這三個(gè)組件可以輕松的記錄信息的類型和級別,并可以在運(yùn)行時(shí)控制日志輸出的樣式和位置。下面對三個(gè)組件分別進(jìn)行說明:
2.4.1日志記錄器Logger
Logger對象是用來取代System.out或者System.err的日志寫出器,用來供程序員輸出日志信息。
配置根Logger,語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName,…
其中,level 是日志記錄的優(yōu)先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別。Log4j建議只使用四個(gè)級別,優(yōu)先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應(yīng)用程序中相應(yīng)級別的日志信息的開關(guān)。比如在這里定義了INFO級別,則應(yīng)用程序中所有DEBUG級別的日志信息將不被打印出來。appenderName就是指定日志信息輸出到哪個(gè)地方??赏瑫r(shí)指定多個(gè)輸出目的地。
2.4.2輸出目的地Appender
Log4j日志系統(tǒng)允許把日志輸出到不同的地方,如控制臺(tái)(Console)、文件(Files)、根據(jù)天數(shù)或者文件大小產(chǎn)生新的文件、以流的形式發(fā)送到其它地方等等。
配置appender,其語法表示為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.option = valueN
"fully.qualified.name.of.appender.class"可以指定下面五個(gè)目的地中的一個(gè):
1).org.apache.log4j.ConsoleAppender(控制臺(tái))
2).org.apache.log4j.FileAppender(文件)
3).org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件)
4).org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件)
5).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.log:指定消息輸出到mylog.log文件。
- Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
(3).DailyRollingFileAppender 選項(xiàng)
- Threshold=WARN:指定日志消息的輸出最低層次。
- ImmediateFlush=true:默認(rèn)值是true,意味著所有的消息都會(huì)被立即輸出。
- File=mylog.log:指定消息輸出到mylog.log文件。
- Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
- DatePattern='.'yyyy-ww:每周滾動(dòng)一次文件,即每周產(chǎn)生一個(gè)新的文件。當(dāng)然也可以指定按月、周、天、時(shí)和分。
即對應(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.log:指定消息輸出到mylog.log文件。
- 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ù)。
2.4.3格式(布局)Layout
有時(shí)希望根據(jù)自己的喜好格式化自己的日志輸出。Log4j可以在Appender的后面附加Layout來完成這個(gè)功能。
配置Layout,其語法表示為:
log4j.appender.appenderName.layout =fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.option = valueN
Layout提供了四種日志輸出樣式,如下所示:
(1).org.apache.log4j.HTMLLayout(以HTML表格形式布局),
(2).org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
(3).org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
(4).org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)
HTMLLayout 選項(xiàng)
LocationInfo=true:默認(rèn)值是false,輸出java文件名稱和行號
Title=my app file: 默認(rèn)值是 Log4J Log Messages.
2.PatternLayout 選項(xiàng)
ConversionPattern=%m%n :指定怎樣格式化指定的消息。
這里需要說明的就是日志信息格式中幾個(gè)符號所代表的含義:
- -x號:x信息輸出時(shí)左對齊
- %p: 輸出日志信息優(yōu)先級,即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: 輸出代碼中的行號
- %m: 輸出代碼中指定的消息,產(chǎn)生的日志具體信息
- %n: 輸出一個(gè)回車換行符
可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,默認(rèn)的情況下右對齊。
2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,"-"號指定左對齊。
3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大于30的話,就會(huì)將左邊多出的字符截掉,但小于30的話也不會(huì)有空格。
4)%20.30c:如果category的名稱小于20就補(bǔ)空格,并且右對齊,如果其名稱長于30字符,就從左邊把多出的字符截掉。
2.5.log4j配置示例
LOG4J的配置之簡單使它遍及于越來越多的應(yīng)用中:Log4J配置文件實(shí)現(xiàn)了輸出到控制臺(tái)、文件、回滾文件、發(fā)送日志郵件、輸出到數(shù)據(jù)庫日志表、自定義標(biāo)簽等全套功能。
log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true
n 應(yīng)用于控制臺(tái)
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=%d-%c-%-4r[%t]%-5p%c%x-%m%n
n 應(yīng)用于文件
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=%d - %c -%-4r [%t] %-5p %c %x - %m%n
n 應(yīng)用于文件回滾
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=%d - %c -%-4r [%t] %-5p %c %x - %m%n
n 應(yīng)用于socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true 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
n 發(fā)送日志給郵件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.From=web@www.wuset.com log4j.appender.MAIL.SMTPHost=www.wusetu.com log4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=web@www.wusetu.com log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=%d-%c-%-4r[%t]%-5p%c%x-%m%n
n 用于數(shù)據(jù)庫
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 ('%d - %c -%-4r [%t] %-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 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
n 自定義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
3.在WEB應(yīng)用中為SPRING配置Log4j
首先需要在web.xml文件中加入下面的配置語句:
<!-- 為避免項(xiàng)目間沖突,定義唯一的 webAppRootKey--> <context-param> <param-name>webAppRootKey</param-name> <param-value>myProject.root</param-value> </context-param> <!-- 加載log4j的配置文件log4j.properties --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/classes/config/log4j/log4j.properties</param-value> </context-param> <!-- 設(shè)定刷新日志配置文件的時(shí)間間隔,這里設(shè)置為60s --> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <!-- 加載Spring框架中的log4j監(jiān)聽器Log4jConfigListener --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
屬性log4jConfigLocation的值建議還是設(shè)置為:/WEB-INF/classes/log4j.properties,這樣我們在不啟動(dòng)web應(yīng)用的時(shí)候,做一些測試就能夠正確地記錄日志信息。Log4jConfigListener是spring提供的工具類,它開啟一個(gè)log4j的監(jiān)視線程,并每60(log4jRefreshInterval變量定義)秒檢測日志配置變化,從而不需要每次重新啟動(dòng)web服務(wù)來應(yīng)用新的配置。在tomcat中沒有根據(jù)web應(yīng)用來分開系統(tǒng)屬性。所以必須為每一個(gè)web應(yīng)用定義唯一的"webAppRootKey",我們?nèi)∶麨閣ebApp.root.在啟動(dòng)環(huán)境后,Log4jConfigListener會(huì)將值注入到webApp.root變量。
4.在代碼中使用Log4j
4.1.得到記錄器
使用Log4j,第一步就是要獲取日志記錄器,這個(gè)記錄器將負(fù)責(zé)控制日志信息。
public static Logger getLogger( String name)
通過指定的名字獲得記錄器,如果必要的話,則為這個(gè)名字創(chuàng)建一個(gè)新的記錄器。name一般取本類的名字,比如:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
4.2.讀取配置文件
當(dāng)獲得了日志記錄器之后,第二步將配置Log4j環(huán)境,其語法為:
若將log4j.properties放在工程根目錄下也可不寫此句,程序會(huì)自動(dòng)找到配置文件。
BasicConfigurator.configure (): 自動(dòng)快速地使用缺省Log4j環(huán)境。PropertyConfigurator.configure ( String configFilename) :讀取使用Java的特性文件編寫的配置文件。
DOMConfigurator.configure ( String filename ):讀取XML形式的配置文件。
log4j使用以上3種配置器來初始化,使用PropertyConfigurator適用于所有的系統(tǒng)。如下的語句。
PropertyConfigurator.configure("log4j.properties");
對于一般的java project可以不使用上面的語句初始化log4j,log4j會(huì)自動(dòng)在classpath下,找到配置文件并初始化。如果log4j不能自動(dòng)初始化配置文件,那么就需要用上面的方法進(jìn)行初始化。
注意:初始化配置文件,最好只在系統(tǒng)啟動(dòng)的時(shí)候執(zhí)行一次,如果執(zhí)行多次,一是浪費(fèi)資源,二就是對于老版本的log4j,使用DailyRollingFileAppender時(shí),可能會(huì)出現(xiàn)問題。
4.3.插入記錄信息(格式化日志信息)
當(dāng)上兩個(gè)必要步驟執(zhí)行完畢,您就可以輕松地使用不同優(yōu)先級別的日志記錄語句插入到您想記錄日志的任何地方,其語法如下:
Logger.debug ( Object message ) ;
相關(guān)文章
Java介紹多線程計(jì)算階乘實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了Java多線程計(jì)算階乘的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06java面向?qū)ο笤O(shè)計(jì)原則之合成復(fù)用原則示例詳解
這篇文章主要介紹了java面向?qū)ο笤O(shè)計(jì)原則之合成復(fù)用原則的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10SpringCloud通過Nacos實(shí)現(xiàn)注冊中心與遠(yuǎn)程服務(wù)調(diào)用詳解流程
如果不滿足eureka注冊中心,那么本文記錄的Nacos是不二之選。本文主要記錄Springboot基于Nacos實(shí)現(xiàn)注冊中心以及遠(yuǎn)程服務(wù)調(diào)用2022-07-07