理論知識往往很枯燥,特別是一些技術性文章,讀起來自然沒有像小說那樣情節豐富,充滿了吸引力,根據我個人的一點經驗,我覺得如果你想牢牢掌握並理解它,化爲己用,首先搞清楚這幾個問題:這個東西是什麼,能幹什麼,爲什麼要這樣做,不過也有例外,有時候相當難理解,這時候不妨從複製demo開始,先找到點信心後,再一點點去摸清楚理論,這樣即使你過一些時間往了,看看以前自己筆記很快就能回想起來,不至於一點印象也沒有,完全不知。
當然對於lo4j來說它的理論很簡單。其應用也很簡單。第一,你要先配置一下,第二,你要在項目運行時候加載,第三,你就可以在你的代碼中隨心所欲的記錄下你要記錄的東西。如果非要說哪裏更復雜,就是在配置的時候稍微有點,如果你每次做項目都是從別的地方複製過來,再改一改也行,過如果你經常配,記憶力又好,這對於你來說壓根不算事,直接默寫出來就行。
那就先簡單介紹Log4j三個主要的組件:Loggers(記錄器),Appenders(輸出源)和Layouts(佈局)。這裏可簡單理解爲日誌類別,日誌要輸出的地方和日誌以何種形式輸出。綜合使用這三個組件可以輕鬆地記錄信息的類型和級別,並可以在運行時控制日誌輸出的樣式和位置。
1. Loggers
Loggers組件在此係統中被分爲五個級別:DEBUG、INFO、WARN、ERROR和FATAL。這五個級別是有順序的,DEBUG<
INFO < WARN < ERROR < FATAL,分別用來指定這條日誌信息的重要程度,明白這一點很重要,Log4j有一個規則:只輸出級別不低於設定級別的日誌信息,假設Loggers級別設定爲INFO,則INFO、WARN、ERROR和FATAL級別的日誌信息都會輸出,而級別比INFO低的DEBUG則不會輸出。
2. Appenders
Log4j日誌系統還提供許多強大的功能,比如允許把日誌輸出到不同的地方,如控制檯(Console)、文件(Files)等,可以根據天數或者文件大小產生新的文件,可以以流的形式發送到其它地方等等。
常使用的類如下:
org.apache.log4j.ConsoleAppender(控制檯)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件)
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
配置模式:
log4j.appender.appenderName = className
log4j.appender.appenderName.Option1 = value1
…
log4j.appender.appenderName.OptionN = valueN
3、Layouts
有時用戶希望根據自己的喜好格式化自己的日誌輸出,Log4j可以在Appenders的後面附加Layouts來完成這個功能。Layouts提供四種日誌輸出樣式,如根據HTML樣式、自由指定樣式、包含日誌級別與信息的樣式和包含日誌時間、線程、類別等信息的樣式。
常使用的類如下:
org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式)
org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串)
org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等信息)
配置模式:
log4j.appender.appenderName.layout =className
log4j.appender.appenderName.layout.Option1 = value1
…
log4j.appender.appenderName.layout.OptionN = valueN
理論知識就這麼,相當簡單,就是不好記,配置的時候沒有提示,不過細心一些就沒有什麼太大問題。
Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是properties屬性文件。下面以properties屬性文件爲例介紹log4j.properties的配置。
1、 配置根Logger:
log4j.rootLogger = [ level ] , appenderName1,appenderName2, …
log4j.additivity.org.apache=false:表示Logger不會在父Logger的appender裏輸出,默認爲true。
level :設定日誌記錄的最低級別,可設的值有OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別,Log4j建議只使用中間四個級別。通過在這裏設定級別,您可以控制應用程序中相應級別的日誌信息的開關,比如在這裏設定了INFO級別,則應用程序中所有DEBUG級別的日誌信息將不會被打印出來。
appenderName:就是指定日誌信息要輸出到哪裏。可以同時指定多個輸出目的地,用逗號隔開。
例如:log4j.rootLogger=INFO,A1,B2,C3
2、配置日誌信息輸出目的地(appender):
log4j.appender.appenderName = className
appenderName:自定義appderName,在log4j.rootLogger設置中使用;
className:可設值如下:
(1)org.apache.log4j.ConsoleAppender(控制檯)
(2)org.apache.log4j.FileAppender(文件)
(3)org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件)
(4)org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
(5)org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
(1)ConsoleAppender選項:
Threshold=WARN:指定日誌信息的最低輸出級別,默認爲DEBUG。
ImmediateFlush=true:表示所有消息都會被立即輸出,設爲false則不輸出,默認值是true。
Target=System.err:默認值是System.out。
(2)FileAppender選項:
Threshold=WARN:指定日誌信息的最低輸出級別,默認爲DEBUG。
ImmediateFlush=true:表示所有消息都會被立即輸出,設爲false則不輸出,默認值是true。
Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。
File=D:/logs/logging.log4j:指定消息輸出到logging.log4j文件中。
(3)DailyRollingFileAppender選項:
Threshold=WARN:指定日誌信息的最低輸出級別,默認爲DEBUG。
ImmediateFlush=true:表示所有消息都會被立即輸出,設爲false則不輸出,默認值是true。
Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。
File=D:/logs/logging.log4j:指定當前消息輸出到logging.log4j文件中。
DatePattern='.'yyyy-MM:每月滾動一次日誌文件,即每月產生一個新的日誌文件。當前月的日誌文件名爲logging.log4j,前一個月的日誌文件名爲logging.log4j.yyyy-MM。
另外,也可以指定按周、天、時、分等來滾動日誌文件,對應的格式如下:
1)'.'yyyy-MM:每月
2)'.'yyyy-ww:每週
3)'.'yyyy-MM-dd:每天
4)'.'yyyy-MM-dd-a:每天兩次
5)'.'yyyy-MM-dd-HH:每小時
6)'.'yyyy-MM-dd-HH-mm:每分鐘
(4)RollingFileAppender選項:
Threshold=WARN:指定日誌信息的最低輸出級別,默認爲DEBUG。
ImmediateFlush=true:表示所有消息都會被立即輸出,設爲false則不輸出,默認值是true。
Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。
File=D:/logs/logging.log4j:指定消息輸出到logging.log4j文件中。
MaxFileSize=100KB:後綴可以是KB,MB
或者GB。在日誌文件到達該大小時,將會自動滾動,即將原來的內容移到logging.log4j.1文件中。
MaxBackupIndex=2:指定可以產生的滾動文件的最大數,例如,設爲2則可以產生logging.log4j.1,logging.log4j.2兩個滾動文件和一個logging.log4j文件。
3、配置日誌信息的輸出格式(Layout):
log4j.appender.appenderName.layout=className
className:可設值如下:
(1)org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
(2)org.apache.log4j.PatternLayout(可以靈活地指定佈局模式)
(3)org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串)
(4)org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)
(1)HTMLLayout選項:
LocationInfo=true:輸出java文件名稱和行號,默認值是false。
Title=My Logging:默認值是Log4JLog Messages。
(2)PatternLayout選項:
ConversionPattern=%m%n:設定以怎樣的格式顯示消息。
格式化符號說明:
%p:輸出日誌信息的優先級,即DEBUG,INFO,WARN,ERROR,FATAL。
%d:輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,如:%d{yyyy/MM/ddHH:mm:ss,SSS}。
%r:輸出自應用程序啓動到輸出該log信息耗費的毫秒數。
%t:輸出產生該日誌事件的線程名。
%l:輸出日誌事件的發生位置,相當於%c.%M(%F:%L)的組合,包括類全名、方法、文件名以及在代碼中的行數。例如:test.TestLog4j.main(TestLog4j.java:10)。
%c:輸出日誌信息所屬的類目,通常就是所在類的全名。
%M:輸出產生日誌信息的方法名。
%F:輸出日誌消息產生時所在的文件名稱。
%L::輸出代碼中的行號。
%m::輸出代碼中指定的具體日誌信息。
%n:輸出一個回車換行符,Windows平臺爲"rn",Unix平臺爲"n"。
%x:輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像javaservlets這樣的多客戶多線程的應用中。
%%:輸出一個"%"字符。
另外,還可以在%與格式字符之間加上修飾符來控制其最小長度、最大長度、和文本的對齊方式。如:
1) c:指定輸出category的名稱,最小的長度是20,如果category的名稱長度小於20的話,默認的情況下右對齊。
2)%-20c:"-"號表示左對齊。
3)%.30c:指定輸出category的名稱,最大的長度是30,如果category的名稱長度大於30的話,就會將左邊多出的字符截掉,但小於30的話也不會補空格。
利用上面的說明配置一個比較簡單的log4j,只是向你的控制檯輸出你的日誌記錄
log4j.rootLogger=DEBUG,console#配置根記錄器
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.consloe.ThresholdFlush=true
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p]%d(%r) --> [%t] %l: %m %x %n
其他再高級點配置也跟這個很類似,只不過是功能更豐富了一些。理論加實踐,是不是讓你印象更深刻了呢,下面在輸出到控制檯的基本上配置一個可以生成本地日誌文件
log4j.rootLogger=DEBUG,console,A
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.consloe.ThresholdFlush=true
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p]%d(%r)-->[%t]%l:%m%x%n
log4j.appender.A=org.apache.log4j.FileAppender
log4j.appender.A.Threshold=DEBUG
log4j.appender.A.ImmediateFlush=true
log4j.appender.A.Append=true
log4j.appender.A.File=D:/gaox.txt
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=[%-5p]%d(%r)-->[%t]%l:%m%x%n
再稍微高級一點的配置就是爲某一個包下或者某一個類定製一個日誌記錄
log4j.rootLogger=DEBUG,console,A
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.consloe.ThresholdFlush=true
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p]%d(%r)-->[%t]%l:%m%x%n
log4j.appender.A=org.apache.log4j.FileAppender
log4j.appender.A.Threshold=DEBUG
log4j.appender.A.ImmediateFlush=true
log4j.appender.A.Append=true
log4j.appender.A.File=D:/gaox.txt
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=[%-5p]%d(%r)-->[%t]%l:%m%x%n
log4j.logger.com.gaox.entity.Student=Debug,B
log4j.appender.B=org.apache.log4j.FileAppender
log4j.appender.B.Threshold=DEBUG
log4j.appender.B.ImmediateFlush=true
log4j.appender.B.Append=true
log4j.appender.B.File=D:/student.txt
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=[%-5p]%d(%r)-->[%t]%l:%m%x%n
配置文件配置好了還有最後一個非常關鍵的地方就是配置文件的加載,不管你建的是什麼項目,lo4j會項目啓動時默認加載項目src根目錄下的log4j.properties配置文件,如果你的配置文件不在根目錄下,比如你在src下面建了一個config的文件件來放各種配置文件,包括有log4j.properties,這時就需要你在項目啓動的時候手動來加載這個配置文件了。加載配置文件方法有很多,這裏介紹一種最基礎的加載方式,就一行代碼:PropertyConfigurator.configure(“配置文件的絕對路徑”);
配置完成,然後在項目啓動的時候加載,最後在項目使用了需要輸出日誌的類裏聲明一個記錄器:
public Loggerlogger = Logger.getLogger(Student.class)
在需要日誌輸出的地方就可以用logger.info("")輸出日誌了
下面附上源碼例子:
項目結構
pom.xml:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
Student.java:
package com.gaox.entity;
import org.apache.log4j.Logger;
/**
* @author gaox
* @createTime 2017年6月10日 下午5:14:04
*/
public class Student {
private String name;
private Integer age;
public Logger logger = Logger.getLogger(Student.class);
public Student(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public Student() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public void show() {
logger.info("我叫" + this.name + ",今年" + this.age + "歲。");
}
}
package com.gaox.entity;
import org.apache.log4j.Logger;
/**
* @author gaox
* @createTime 2017年6月6日 上午9:41:42
*/
public class Person {
public Logger logger=Logger.getLogger(Person.class);
private String name;
private String sex ;
private String address;
public Person(String name, String sex, String address) {
super();
this.name = name;
this.sex = sex;
this.address = address;
logger.info("有參數構造方法被調用");
}
public Person() {
super();
logger.info("無參構造方法被調用");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String say(String str){
logger.info("say方法被調用了");
return str;
}
public String show (String str ){
return str;
}
}
log4j.properties:
log4j.rootLogger=DEBUG,console,A
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.consloe.ThresholdFlush=true
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
log4j.appender.A=org.apache.log4j.FileAppender
log4j.appender.A.Threshold=DEBUG
log4j.appender.A.ImmediateFlush=true
log4j.appender.A.Append=true
log4j.appender.A.File=D:/gaox.txt
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
log4j.logger.com.gaox.entity.Student=Debug,B
log4j.appender.B=org.apache.log4j.FileAppender
log4j.appender.B.Threshold=DEBUG
log4j.appender.B.ImmediateFlush=true
log4j.appender.B.Append=true
log4j.appender.B.File=D:/student.txt
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
package com.gaox.test;
import org.apache.log4j.PropertyConfigurator;
import com.gaox.entity.Person;
/**
* @author gaox
* @createTime 2017年6月6日 上午9:45:21
*/
public class Test {
public static void main(String[] args) {
PropertyConfigurator.configure(Test.class.getResource("/").getPath()+"/config/log4j.properties");
System.out.println(new Person("明明","女","鄭州").say("hello"));
}
}
package com.gaox.test;
import org.apache.log4j.PropertyConfigurator;
import com.gaox.entity.Student;
/**
* @author gaox
* @createTime 2017年6月10日 下午5:20:45
*/
public class Test2 {
public static void main(String[] args) {
PropertyConfigurator.configure(Test2.class.getResource("/").getPath()+"/config/log4j.properties");
Student s=new Student("明明", 18);
s.show();
}
}