一赎婚、log4j介紹
1 . 為什么要使用日志
答 : 開(kāi)發(fā)階段發(fā)現(xiàn)程序的問(wèn)題 , 排除錯(cuò)誤 , 產(chǎn)品階段 , 可以記錄系統(tǒng)運(yùn)行的一些狀態(tài)信息 , 程序運(yùn)行的狀態(tài) ;
2 . System . out . println的局限性
答 : (1)不能在運(yùn)行時(shí)打開(kāi)或者關(guān)閉 ;
? ? ? ?(2)不能選擇包或者類(lèi) , 在運(yùn)行的時(shí)候打開(kāi)或者關(guān)閉 ;
? ? ? ?(3)輸出的信息沒(méi)有分級(jí) ;
? ? ? ?(4)只能輸出文本信息 ;
? ? ? ?(5)不能改變輸出位置 ;
3 . 什么是log4j ?
答 : log4j是目前最流行的java開(kāi)源日志處理框架 , 是Apache的子項(xiàng)目 ;
4 . 關(guān)于配置文件
答 : log4j中的xml配置文件要優(yōu)先于properties文件 ;
5 . log4j的特性
答 : (1)線(xiàn)程安全 ;
? ? ? ?(2)log4j是經(jīng)過(guò)優(yōu)化速度的 ;
? ? ? ?(3)log4j是基于一個(gè)名為記錄器的層次結(jié)構(gòu) ;
? ? ? ?(4)log4j的支持每個(gè)記錄器多輸出追加器(appender) ;
? ? ? ?(5) log4j支持國(guó)際化 ;
? ? ? ?(6)log4j并不限于一組預(yù)定義的設(shè)備 ;
? ? ? (7)日志行為可以使用配置文件在運(yùn)行時(shí)設(shè)置 ;
? ? ? (8)log4j設(shè)計(jì)從一開(kāi)始就是處理java異常 ;
? ? ? (9)log4j有多個(gè)級(jí)別 , 通過(guò)控制這些級(jí)別可以實(shí)現(xiàn)將某些不想輸出的信息過(guò)濾掉 ;
? ? ?(10) 日志輸出的格式可以通過(guò)拓展Layout類(lèi)容易的改變 ;
? ? ?(11)日志輸出的目標(biāo) , 以及在寫(xiě)入策略可通過(guò)實(shí)現(xiàn)Appender程序接口改變 ;
? ? ?(12) log4j會(huì)故障停止 , 然而 , 盡管它肯定努力確保傳遞 , log4j不保證每個(gè)日志語(yǔ)句將被傳遞到目的地 ;
6 . log4j的主要組成部分
答 : (1)loggers : 負(fù)責(zé)捕獲記錄信息 ;
? ? ? ?(2)appenders : 負(fù)責(zé)發(fā)布日志信息 , 以不同的首選目的地 ;
? ? ? ?(3)layouts : 負(fù)責(zé)格式化不同風(fēng)格的日志信息 ;
7 . log4j級(jí)別(從小到大)
答 : ALL : 各級(jí)包括自定義級(jí)別 ;
? TRACE : 指定細(xì)粒度比DEBUG更低的信息事件 ;
? DEBUG : 調(diào)試級(jí)別 ;
? INFO : 表明消息在粗粒度級(jí)別上突出強(qiáng)調(diào)應(yīng)用程序是非常有幫助的 , 也就是輸出一些提示信息 ;
? WARN : 輸出潛在的有可能出錯(cuò)的情形 , 也就是輸出警告信息 ;
? ERROR : 指出發(fā)生的不影響系統(tǒng)繼續(xù)運(yùn)行的錯(cuò)誤信息 ;
? FATAL : 指出嚴(yán)重的錯(cuò)誤 , 這些錯(cuò)誤將會(huì)導(dǎo)致系統(tǒng)終止運(yùn)行 ;
? OFF : 為最高級(jí)別 , 用于關(guān)閉所有日志信息的輸出 ;
核心規(guī)則 : log4j只會(huì)輸出級(jí)別大于或者等于指定級(jí)別的信息 ;
8 . properties文件配置
答 : 1 . 配置根Logger , 語(yǔ)法為 :
? ? ? log4j.rootLogger = [ level ] , appenderName , appenderName ……
? 注意 : (1)第七條中雖然羅列了很多級(jí)別 , 但log4j推薦只使用四個(gè)級(jí)別 , 優(yōu)先級(jí)從高到低分別是ERROR , WARN , INFO , DEBUG ;
? ? ? ? ? ? (2)appenderName指的是日志輸出的地址 , 可以同時(shí)指定n個(gè) ;
? 2 . 配置日志輸出的目的地Appender以及每個(gè)輸出文件的各項(xiàng)屬性 , 語(yǔ)法為 :
? ? ? ? log4j.appender.appenderName = fully.qualified.name.of.appender.class
? ? ? ? log4j.appender.appenderName.option1 = value1
? 注意 : log4j中提供的appender有以下幾種 :
? ? ? ? ? ? 1 . org.apache.log4j.ConsoleAppender(控制臺(tái)) ;
? ? ? ? ? ? 2 . org.apache.log4j.FileAppender(文件) ;
? ? ? ? ? ? 3 . org.apache.log4j.DailyRollingFileAppender(按照一定的頻度滾動(dòng)產(chǎn)生日志記錄文件 , 默認(rèn)每天產(chǎn)生一個(gè)文件) ;
? ? ? ? ? ? 4 . org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件) ;
? ? ? ? ? ? 5 . org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到指定的位置) ;
? 3 . 配置日志信息的格式或者布局layout以及布局的各項(xiàng)屬性 , 語(yǔ)法為 :
? ? ? ? log4j.appender.appenderName.layout = fully.qualified.name.of.appender.class
? ? ? ? log4j.appender.appenderName.layout.option1 = value
? 注意 : log4j中提供的layout有以下幾種 :
? ? ? ? ? 1 . org.apache.log4j.HTMLLayout(以HTML表格形式布局) ;
? ? ? ? ? 2 . org.apache.log4j.PatternLayout(可以靈活的指定布局模式 , 需要配置layout.ConversionPattern屬性) ;
? ? ? ? ? 3 . org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串) ;
? ? ? ? ? 4 . org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間 , 線(xiàn)程 , 類(lèi)別等等信息) ;
9 . 控制臺(tái)選項(xiàng)
答 : 1 . log4j.appender.appenderName.Threshold = error
? ? ? 用法 : rootLogger里配置debug , 然后某個(gè)文件專(zhuān)門(mén)存儲(chǔ)error以及更高級(jí)別的錯(cuò)誤信息 , 那么就在這個(gè)配置這個(gè)文件的時(shí)候指定Threshold屬性為error ;
? 2 . log4j.appender.appenderName.ImmediateFlush=true
? ? ? 用法 : 默認(rèn)值是true , 意味著所有的消息都會(huì)被立即輸出 , false則是不輸出 ;
? 3 . log4j.appender.appenderName.target=System.out
? ? ? 用法 : 默認(rèn)值為System.out , 輸出到控制臺(tái) , 還可以取值System.err , 當(dāng)做錯(cuò)誤信息輸出 , 輸出的信息全部為紅色 ;
? 4 . log4j.appender.appenderName.File=../../../../logs/log.appenderName.txt
? ? ? 用法 : 指定日志輸出到指定位置 , 用的是相對(duì)于配置文件根目錄的相對(duì)路徑 ;
? 5 . log4j.appender.appenderName.File.Append=true
? ? ? 用法 : 默認(rèn)值是true , 即將消息追加到指定文件中 , 如果取值為false , 則會(huì)覆蓋之前的日志內(nèi)容 ;
? 6 . log4j.appender.appenderName.MaxFileSize=20MB
? ? ? 用法 : 后綴可以是KB , MB , GB , 當(dāng)日志文件的大小到達(dá)指定大小后 , 將會(huì)自動(dòng)滾動(dòng) , 即將原來(lái)的內(nèi)容移到fileName.1文件中 , 用記事本打開(kāi)該文件即可看到原來(lái)的內(nèi)容 , 改屬性只能在 appender=org.apache.log4j.RollingFileAppender 時(shí)使用 ;
? 7 . log4j.appender.appenderName.MaxBackupIndex=10
? ? ? 用法 : 指定可以產(chǎn)生滾動(dòng)文件的最大數(shù)量 , 與RollingFileAppender和MaxFileSize屬性一起使用 , 當(dāng)MaxBackupIndex=n的時(shí)候 , 最大日志存在數(shù)量為n+1 , 即log.txt , log.txt.1 , ... , log.txt.n , 當(dāng)在服務(wù)器上運(yùn)行的時(shí)候 , 如果對(duì)日志數(shù)量沒(méi)有限制 , 那么隨之時(shí)間的推移 , 日志文件會(huì)越來(lái)越多 , 占用的內(nèi)存也將越來(lái)越多 , 直到占滿(mǎn)整個(gè)盤(pán) ;
? 8 . log4j.appender.appenderName.DatePattern='.'yyyy-MM-dd
? ? ? 用法 : 該屬性在 log4j.appender.appenderName=org.apache.log4j.DailyRollingFileAppender 時(shí)使用 , DailyRollingFileAppender默認(rèn)的頻度是每天產(chǎn)生一個(gè)日志記錄文件 , 可以在DatePattern屬性值中指定其他的頻度 , 常用的幾個(gè)頻度如下 :
? ? ? ? 1 . '.'yyyy-MM : 每月產(chǎn)生一個(gè)日志記錄文件 ;
? ? ? ? 2 . '.'yyyy-ww : 每周產(chǎn)生一個(gè)日志記錄文件 ;
? ? ? ? 3 . '.'yyyy-MM-dd : 每天產(chǎn)生一個(gè)日志記錄文件 ;
? ? ? ? 4 . '.'yyyy-MM-dd-a : 每半天產(chǎn)生一個(gè)日志記錄文件 ;
? ? ? ? 5 . '.'yyyy-MM-dd-HH : 每小時(shí)產(chǎn)生一個(gè)日志記錄文件 ;
? ? ? ? 6 . '.'yyyy-MM-dd-HH-mm : 每分鐘產(chǎn)生一個(gè)日志記錄文件 ;
? ? ? ? 注意 : 該屬性指定值之后 , 將會(huì)按照指定的頻度來(lái)生成日志記錄文件 , 假設(shè)指定生成一個(gè)名為 log.txt 的文件 , 頻度指定為每分鐘產(chǎn)生一個(gè)日志記錄文件 , 當(dāng)達(dá)到指定頻度后 , 會(huì)將log.txt文件中記錄的之前的日志記錄 , 重新寫(xiě)入一個(gè)名為 log.txt.yyyy-MM-dd-HH-mm的文件中 , 而此時(shí) log.txt 文件中存放的是新生成的日志信息 , 該過(guò)程循環(huán)往復(fù) ;
10 . ConversionPattern參數(shù)
答 : 假設(shè)當(dāng)前java文件名為T(mén)est , 所在包名為log4j :
? 1 . %c : 顯示當(dāng)前l(fā)ogger空間全稱(chēng) , 例如 : log4j.Test ;
? ? ? ? %c{層數(shù)} : 最內(nèi)層的java文件為第一層 , 例如 : %c{1} , 顯示為T(mén)est , 當(dāng)層數(shù)大于實(shí)際存在的最大層數(shù)時(shí) , 顯示最大實(shí)際存在層數(shù) ;
? 2 . %10c : 若名字空間長(zhǎng)度小于10 , 則在左邊將欠缺的長(zhǎng)度用空格補(bǔ)齊 , 該種情況為默認(rèn)的右對(duì)齊方式 ;
? ? ? ? %-10c : 若名字空間長(zhǎng)度小于10 , 則在右邊將欠缺的長(zhǎng)度用空格補(bǔ)齊 , 該種情況為默認(rèn)的左對(duì)齊方式 ;
? 3 . %.3c : 從空間名最右邊開(kāi)始顯示指定的長(zhǎng)度 , 超出該長(zhǎng)度的部分將被截取 ;
? 4 . %10.15c : 若空間名長(zhǎng)度小于10 , 則左邊將欠缺的長(zhǎng)度用空格補(bǔ)齊 , 若長(zhǎng)度超過(guò)15 , 則將多余部分截取 ;
? 7 . %-10.15c : 若空間名長(zhǎng)度小于10 , 則右邊將欠缺的長(zhǎng)度用空格補(bǔ)齊 , 若長(zhǎng)度超過(guò)15 , 則將多余部分截取 ;
? 8 . %d : 顯示日志記錄時(shí)間 , 默認(rèn)時(shí)間格式為ISO8601定義的日期格式 ;
? ? ? ? %d{yyyy-MM-dd HH:mm:ss} : 按照指定的時(shí)間格式顯示日期 ;
? 9 . %d{ABSOLUTE} : 22:15:30,076 ;
? ? ? ? %d{DATE} : 12 Oct 2018 22:15:30,076 ;
? ? ? ? %d{ISO8601} : 2018-07-20 22:23:30,076 ;
? 10 . %F : 顯示調(diào)用logger的源文件名 , 例如 : Test.java ;
? 11 . %l : 輸出日志事件的發(fā)生位置 , 包括類(lèi)目名 , 發(fā)生的線(xiàn)程 , 以及在代碼中的行數(shù) , 例如 : log4j.log4jTest.main(log4jTest.java:40) ;
? 12 : %m : 顯示輸出消息 ;
? 13 . %M : 顯示調(diào)用logger的方法名 ;
? 14 . %n : 換行符 ;
? 15 : %p : 顯示該條目的優(yōu)先級(jí) ;
? 16 . %r : 顯示從程序啟動(dòng)時(shí)到記錄該條日志時(shí)已經(jīng)經(jīng)過(guò)的時(shí)間 , 單位毫秒 ;
? 17 . %t : 顯示產(chǎn)生該日志條目的線(xiàn)程名 ;
? 18 . %x : 按NDC(Nested Diagnostic Context , 線(xiàn)程堆棧) : 順序輸出日志 ;
? ? ? ? ? %X : 按MDC(Mapped Diagnostic Context , 線(xiàn)程映射表)輸出日志 , 通常用于多個(gè)客戶(hù)端連接同一個(gè)服務(wù)器 , 方便服務(wù)器區(qū)分是哪個(gè)客戶(hù)端訪(fǎng)問(wèn)留下來(lái)的日志 ;
? 19 . %% : 顯示一個(gè)百分號(hào) ;
11 . LevelRangeFilter(分級(jí)過(guò)濾器)
答 : 如果想要實(shí)現(xiàn)不同級(jí)別的日志分別輸出到不同的位置 , 可以在properties配置文件中加入如下語(yǔ)句進(jìn)行限制 , 例如 :
? log4j.appender.appenderName.Threshold=debug
? log4j.appender.appenderName.filter.filterName=org.apache.log4j.varia.LevelRangeFilter
? log4j.appender.appenderName.filter.filterName.LevelMin=debug
? log4j.appender.appenderName.filter.filterName.LevelMax=debug
? 解釋 : 將最低輸出級(jí)別LevelMin和最高輸出級(jí)別LevelMax都設(shè)置為debug , 那么就只能輸出debug級(jí)別的日志信息了 ;
(2)log4j使用
將log4j-1.2.17.jar進(jìn)行buildpath桨踪,原來(lái)使用過(guò)maven配置依賴(lài)欺缘,但是在使用時(shí)候報(bào)錯(cuò)所以就直接導(dǎo)入jar包。
log4j.properties文件
#設(shè)置log4j日志輸出路徑
log = D:/logs
#設(shè)置輸出日志級(jí)別和輸入模式
log4j.rootLogger=debug,appender1,FILE
#設(shè)置控制臺(tái)輸出信息
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.appender1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
#設(shè)置日志輸出路徑
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.MaxFileSize=10MB
log4j.appender.FILE.MaxBackupIndex=3
log4j.appender.FILE.File=${log}/testLog.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
測(cè)試demo 類(lèi):
package com.suning.SuningInterfaceAutotest.log4j;
import org.apache.log4j.Logger;
public class demo {
private static Logger logger = Logger.getLogger(demo.class);
public static void main(String[] args) {
logger.debug("This is debug message.");
logger.info("This is info message.");
logger.error("This is error message.");
}
}