柚子快報邀請碼778899分享:log4j學習
柚子快報邀請碼778899分享:log4j學習
依賴
入門案例以及日志級別說明
@Test
public void test01() {
/*
Log4入門案例
注意在家初始化信息:BasicConfigurator.configure();
日志級別說明:
Log4j提供了8個級別的日志輸出,分別為
ALL 最低等級 用于打開所有幾倍的日志記錄
TRACE 程序推進下的追蹤信息,這個追蹤信息的日志級別非常低,一般情況下不使用
DEBUG 指出細粒度信息時間對調(diào)試應用程序是非常有幫助的,主要是配合開發(fā),在開發(fā)過程中打印一些重要的運行信息
INFO 消息的粗粒度級別運行信息
WARN 表示警告,程序在運行過程中會出現(xiàn)的有可能會發(fā)生的隱形的錯誤信息
注意:,有些信息不是錯誤,但是這個級別的輸出目的就是為了給程序員以提示
ERROR 系統(tǒng)的錯誤信息,發(fā)生的錯誤不影響系統(tǒng)的運行
一般情況下,如果不想輸出太多的日志,則使用該級別即可
FATAL 表示嚴重錯誤,它是哪一種一旦發(fā)生系統(tǒng)就不可能繼續(xù)運行的嚴重錯誤
如果這種級別的錯誤出現(xiàn)了,表示程序就可以停止運行了
OFF 最高等級的級別,用戶關閉所有的日志記錄
其中 DEBUG 是默認的日志輸出級別
*/
// 加載初始化配置
BasicConfigurator.configure();
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
配置文件說明
log4j.rootLogger = trace,console
# 配置appender 輸出方式 日志輸出到哪里,現(xiàn)在是控制臺
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 表示輸出的格式
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern = %r [%t] %p %c %x - %m%n
@Test
public void test02() {
/*
配置文件的說明
1、觀察原源碼 BasicConfigurator.configure();
可以得到兩條信息
(1)創(chuàng)建根節(jié)點對象 Logger root = Logger.getRootLogger();
(2)根節(jié)點添加了ConsoleAppender對象(表示默認打印到控制臺,自定義的格式化輸出)
2、不使用 BasicConfigurator.configure();加載
使用自定義的配置文件來實現(xiàn)功能
通過對上邊第一點的輸出
配置文件需要提供Logger、Appender、Layout 3個組件信息(通過配置文件來代替代碼)
分析
Logger logger = Logger.getLogger(Log4jTest.class);
進入到getLogger方法,會看到代碼
LogManager.getLogger(clazz.getName());
LogManager:是一個日志管理器
LogManager,里邊有很多常量,它們代表的就是不同形式(后綴名不同)的配置文件
最常使用的就是log4j.properties 這個屬性文件(語法簡單,使用方便)
問題:log4j.properties的加載時機
找到LogManager的static代碼塊
在static下遭到下列代碼
Loader.getResource("log4j.properties");
系統(tǒng)會去當前類路徑下找到log4j.properties這個文件進行加載
對于maven工程resource目錄就是當前類路徑下的
加載完畢后,配置文件是如何讀取呢?
OptionConverter.selectAndConfigure(url, configuratorClassName,LogManager.getLoggerRepository());
進去方法:
作為屬性文件進行加載: configurator = new PropertyConfigurator();
進入到這個PropertyConfigurator這個屬性類,看到很多常量,這些常量就是我們在屬性配置文件中的配置項
如下兩項是我們必須配置的
static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger";
static final String APPENDER_PREFIX = "log4j.appender.";
通過這行代碼:
String prefix = APPENDER_PREFIX + appenderName;
我們需要自定義一個appendername 假設蛇我們?nèi)サ拿质莄onsole 就是控制臺輸出
(起名字需要見名之意,console那么我們在配置應該配置控制臺輸出)
log4j.appender.console
取值就是log4j中為我們提供的appender類
例如
log4j.appender.console = org.apache.log4j.ConsoleAppender
還可以指定輸出格式
通過代碼:
String layoutPrefix = prefix + ".layout";
配置:
log4j.appender.console.layout = org.apache.log4j.SimpleLayout
通過log4j.properties繼續(xù)在類中搜索
找到方法void configureRootCategory
在這個方法中找到執(zhí)行了parseCategory 方法
觀察這個方法:
執(zhí)行了代碼:StringTokenizer st = new StringTokenizer(value, ",");
表示要以逗號的方式分割字符串,證明了log4j.rootLogger的取值,其中可以有多個值,但是要以逗號進行分割
通過代碼:
String levelStr = st.nextToken();
表示切割后的第一個值是日志的級別
通過代碼:
while(st.hasMoreTokens())
表示接下2~n個都是可以通過循環(huán)來取得的,具體的內(nèi)容是:appenderName(日志輸出到哪里)
證明我們配置方式是:
log4j.rootLogger = 日志級別,appenderName1,appenderName2,...,appenderName n
表示我們可以同時在根節(jié)點上配置多個日志輸出的途徑
通過我們自己的配置文件就可以加載和這個代碼了
*/
// BasicConfigurator.configure();
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
打開日志輸出的詳細信息
@Test
public void test03(){
/*
通過Logger中的開關
打開日志輸出的詳細信息
查看LogManager類中的方法:
getLoggerRepository()
找到代碼LogLog.debug(msg, ex);
Loglog會使用debug級別的輸出為我們展現(xiàn)日志輸出的詳細信息
Logger是記錄系統(tǒng)的日志,那么Loglog的使用來記錄Logger的日志
進入到Loglog.debug(msg, ex)方法中
通過代碼:if(debugEnabled && !quietMode) {
觀察到if判斷中的這兩個開關都是必須開啟才行
!quietMode 是已經(jīng)啟動的狀態(tài),不需要我們?nèi)ス?/p>
debugEnabled默認是關閉的
所以我們只需要設置debugEnabled為true就可以了
*/
LogLog.setInternalDebugging(true);
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
關于log4j.properties 的 layout 的說明
log4j.appender.console.layout.conversionPattern = %r [%t] %p %c %x - %m%n
-X號: X信息輸出時左對齊; %p: 輸出日志信息優(yōu)先級,即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL, %d: 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921 %r: 輸出自應用啟動到輸出該log信息耗費的毫秒數(shù) %c: 輸出日志信息所屬的類目,通常就是所在類的全名 %t: 輸出產(chǎn)生該日志事件的線程名 %l: 輸出日志事件的發(fā)生位置,相當于%C.%M(%F:%L)的組合,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main (TestLog4.Java:10) %x: 輸出和當前線程相關聯(lián)的NDC(嵌套診斷環(huán)境),尤其用到像Java servlets這樣的多客戶多線程的應用中。 %%: 輸出一個"%“字符 %F: 輸出日志消息產(chǎn)生時所在的文件名稱 %L: 輸出代碼中的行號 %m: 輸出代碼中指定的消息,產(chǎn)生的日志具體信息 %n: 輸出一個回車換行符,Windows平臺為”/r/n",Unix平臺為"/n"輸出日志信息換行 **可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。**如: 1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,默認的情況下右對齊。 2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,"-"號指定左對齊。 3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大于30的話,就會將左邊多出的字符截掉,但小于30的話也不會有空格。 4)%20.30c:如果category的名稱小于20就補空格,并且右對齊,如果其名稱長于30字符,就從左邊較遠輸出的字符截掉。
@Test
public void test04() {
/*
關于log4j.properties 的 layout 的說明
其中PatternLayout 是日常使用最多的方式
查看源碼
setConversionPattern這個方式就是PatterLayout的核心方法
conversionPattern
在log4j.properties 這個文件中將layout設置為PatterLayout
主要配置的屬性是conversionPatter
[%p]%r %c %t %d{yyyy:MM:dd HH:mm:ss} %m %n
可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式
[%p]%r %c %t %d{yyyy:MM:dd HH:mm:ss} %m %n
[%-5p] 左對齊5個字符,不足5個空格補齊
[%5p] 右對齊5個字符,不足5個空格補齊
*/
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
將日志輸出到文件中
# 第一個是日志輸出級別 2-n是appenderName(就是日志在哪里展示)
log4j.rootLogger = trace,file
# 配置appender 輸出方式 日志輸出到哪里,輸出到文件
log4j.appender.file = org.apache.log4j.FileAppender
# 表示輸出的格式
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 自定義layout輸出的內(nèi)容
log4j.appender.file.layout.conversionPattern = [%-5p]%r %c %t %d{yyyy:MM:dd-HH:mm:ss} %m %n
# 文件存儲的位置 第一個file是我們自己命名的appenderName 第二個file是我們用來指定文件位置的屬性
log4j.appender.file.file = E://test//log4j.log
# 配置輸出的字符編碼
log4j.appender.file.encoding = utf-8
@Test
public void test05() {
/*
將日志輸出到文件中
console是輸出控制臺的,將日志輸出到文件中,也可以做多方向的輸出
查看FileAppender的源碼
查看屬性信息
protected boolean fileAppend = true; 表示是否追加日志信息,true表示追加
protected int bufferSize = 8*1024; 緩沖區(qū)的大小 kb
繼續(xù)觀察找到 setFile 方法 設置文件的位置
通過ognl可以推斷出setFile這個方法操作的就是File
如果有輸出中文的需求怎么辦
觀察FileAppender的父類 WriterAppender
protected String encoding; 有一個這個屬性,就是來設置日志輸出的字符編碼
*/
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
日志太大對其進行分割----按照文件大小
# 第一個是日志輸出級別 2-n是appenderName(就是日志在哪里展示)
log4j.rootLogger = trace,rollingFile
# 配置RollingFileAppender 輸出方式 日志輸出到哪里,輸出到文件
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
# 表示輸出的格式
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
# 自定義layout輸出的內(nèi)容
log4j.appender.rollingFile.layout.conversionPattern = [%-5p]%r %c %t %d{yyyy:MM:dd-HH:mm:ss} %m %n
# 文件存儲的位置 第一個file是我們自己命名的appenderName 第二個file是我們用來指定文件位置的屬性
log4j.appender.rollingFile.file = E://test//log4j.log
# 配置輸出的字符編碼
log4j.appender.rollingFile.encoding = utf-8
# 指定日志文件內(nèi)容大小 1兆b 超過就進行拆分
log4j.appender.rollingFile.maxFileSize = 1MB
# 指定日志拆分的數(shù)量
log4j.appender.rollingFile.maxBackupIndex = 5
@Test
public void test06() {
/*
將日志輸出到文件中
日志太多了,不方便管理怎么維護
FileAppender為我們提供了好用的子類來進一步對文件輸出進行處理
RollingFileAppender
DailyRollingFileAppender
1、RollingFileAppender
這個類表示按照文件的大小來進行拆分的方式進行操作
配置文件進行RollingFileAppender的相關配置
如何拆分,觀察RollingFileAppender的源碼
protected long maxFileSize = 10*1024*1024;表示拆分文件的大小,默認是10m
protected int maxBackupIndex = 1; 拆分文件的書名
# 指定日志文件內(nèi)容大小 1兆b 超過就進行拆分
log4j.appender.rollingFile.maxFileSize = 1MB
# 指定日志拆分的數(shù)量
log4j.appender.rollinFile.maxBackupIndex = 5
只要文件超過1MB,那么則會生成另外一個文件,文件的數(shù)量最多是5個
文件1 記錄日志 1MB
文件2 記錄日志 1MB
...
...
文件5 記錄日志 1MB
如果5個文件不夠怎么辦,作為日志管理來說,也不可能讓日志無休止的繼續(xù)增長下去
所以,覆蓋策略,按照時間來進行覆蓋,原則就是保留新的,覆蓋舊的
*/
Logger logger = Logger.getLogger(Log4jTest.class);
for (int i = 0; i < 10000; i++) {
logger.fatal(i + "fatal信息" );
logger.error(i + "error信息");
logger.warn(i + "warn信息");
logger.info(i + "info信息");
logger.debug(i + "debug信息");
logger.trace(i + "trace信息");
}
日志太大對其進行分割----按照時間大小
配置文件
# 第一個是日志輸出級別 2-n是appenderName(就是日志在哪里展示)
log4j.rootLogger = trace,dailyRollingFile
# 配置DailyRollingFileAppender 輸出方式 日志輸出到哪里,輸出到文件
log4j.appender.dailyRollingFile = org.apache.log4j.DailyRollingFileAppender
# 表示輸出的格式
log4j.appender.dailyRollingFile.layout = org.apache.log4j.PatternLayout
# 自定義layout輸出的內(nèi)容
log4j.appender.dailyRollingFile.layout.conversionPattern = [%-5p]%r %c %t %d{yyyy:MM:dd-HH:mm:ss} %m %n
# 文件存儲的位置 第一個file是我們自己命名的appenderName 第二個file是我們用來指定文件位置的屬性
log4j.appender.dailyRollingFile.file = E://test//log4j.log
# 配置輸出的字符編碼
log4j.appender.dailyRollingFile.encoding = utf-8
# 根據(jù)時間來進行拆分
# 設置DatePattern屬性為'.'yyyy-ww 這個是按照周來進行拆分日志
log4j.appender.dailyRollingFile.datePattern = '.'yyyy-MM-dd HH-mm-ss
柚子快報邀請碼778899分享:log4j學習
相關文章
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。