一? log4j基本知識
1.1 log4j的日志級別
Log4j定義了8個級別的log(除去OFF和ALL,可以說分為6個級別),優先級從低到高依次為:All,trace,debug,info,warn,error,fatal,off。
當日志級別設置為某個值的時候,低于它的日志信息將不會被記錄,只有高于設置的級別的信息會被記錄。
【ALL】:最低等級的,用于打開所有日志記錄。
【Trace】:很低日志級別,一般很少使用
【Debug】:debug級別的主要輸出調試性質的內容,該級別日志主要用于在開發、測試階段輸出,該級別的日志應盡可能地詳盡,便于在開發、測試階段出現問題或者異常時,對齊進行分析。
【Info】:INFO日志主要記錄系統關鍵信息,旨在保留系統正常工作期間關鍵運行指標,開發人員可以將初始化系統配置、業務狀態變化信息,或者用戶業務流程中的核心處理記錄到INFO日志中,方便日常運維工作以及錯誤回溯時上下文場景復現。建議在項目完成后,在測試環境將日志級別調成 INFO,然后通過 INFO 級別的信息看看是否能了解這個應用的運用情況,如果出現問題后是否這些日志能否提供有用的排查問題的信息。
【warn】:warn級別的主要輸出警告性質的內容,這些內容是可以預知且是有規劃的,比如,某個方法入參為空或者該參數的值不滿足運行該方法的條件時,在warn級別時應輸出較為詳盡的信息,以便于事后對日志進行分析。
【error】:error級別主要對于一些不可預知的信息,如,錯誤,異常等,比如,在catch快中捕獲的網絡通信,數據庫連接等異常,如果異常對系統的整個流程影響不大,可以使用warn級別日志輸出。在輸出error級別的日志時,盡量多地輸出方法入參數、方法執行過程中產生的對象等數據,在帶有錯誤、異常對象的數據時,需要將該對象一并輸出。
【fatal】:指出每個嚴重的錯誤事件,將會導致應用程序的退出,這個級別比較高了。重大錯誤,這種級別你可以直接停止程序了。【1】https://blog.csdn.net/wsskl/article/details/137580290
【OFF】:最高等級的,用于關閉所有日志記錄。
1.2?log4j的日志文件結構*
1.2.1 概述
Log4j的日志文件主要結構:Loggers(記錄器),Appenders (輸出源)和Layouts(布局)。這里可簡單理解為日志類別,日志要輸出的地方和日志以何種形式輸出。
1.properties: 定義一些變量,如日志格式,路徑等。
2.Appenders:定義日志輸出的目標位置,如控制臺,文件等。
3.Loggers:定義日志記錄器,控制日志的輸出級別和目標。
4.filters:定義過濾條件,控制日志輸出。
其中<configuration>標簽的status屬性用于設置log4j2自身jar里代碼的日志輸出級別。將status設置為debug可以獲得更詳細的內部日志輸出,這對于調試和問題排查非常有幫助。
5.完整的結構
1.2.2 詳解
Loggers(記錄器):Loggers組件被分為7個級別,優先級從低到高:all、debug、info、warn、error、fatal、off。任何一個級別只輸出本級別以及它級別以上的級別內容。
Appends(輸出源):Log4j允許把日志輸出到不同的地方,如控制臺(Console)、文件(Files)等。
Layout(布局):Layout的作用是控制Log信息的輸出方式,也就是格式化輸出的信息。
1根節點Configuration有兩個屬性:status和monitorinterval,有兩個子節點:Appenders和Loggers(表明可以定義多個 Appender和Logger):
status用來指定log4j本身的打印日志的級別。
monitorinterval用于指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s
2.Appenders節點,常見的有三種子節點:Console、RollingFile、File:
1)Console節點用來定義輸出到控制臺的Appender
???name:指定 Appender 的名字
???target:SYSTEM_OUT 或SYSTEM_ERR,一般只設置默認:SYSTEM_OUT
???PatternLayout:輸出格式,不設置默認為%m%n
2)File節點用來定義輸出到指定位置的文件的Appender
????name:指定Appender的名字
????fileName:指定輸出日志的目的文件帶全路徑的文件名
????PatternLayout:輸出格式,不設置默認為%m%n
3)RollingFile節點用來定義超過指定大小自動刪除舊的創建新的的Appender
name:指定Appender的名字
fileName:指定輸出日志的目的文件帶全路徑的文件名
PatternLayout:輸出格式,不設置默認為%m%n
filePattern:指定新建日志文件的名稱格式
Policies:指定滾動日志的策略,就是什么時候進行新建日志文件輸出日志
TimeBasedTriggeringPolicy:Policies子節點,基于時間的滾動策略,interval屬性用來指定多久滾動一次,默認是1 hour。modulate=true用來調整時間:比如現在是早上3am,interval是4,那么第一次滾動是在4am,接著是8am,12am...而不是7am
SizeBasedTriggeringPolicy:Policies子節點,基于指定文件大小的滾動策略,size 屬性用來定義每個日志文件的大小。
DefaultRolloverStrategy:用來指定同一個文件夾下最多有幾個日志文件時開始刪除最舊的,創建新的(通過max屬性)。
3.Loggers節點,常見的有兩種Root和Logger:
1)root節點用來指定項目的根日志,如果沒有單獨指定 Logger,那么就會默認使用該 Root日志輸出
level:日志輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
AppenderRef:Root的子節點,用來指定該日志輸出到哪個Appender,子節點的ref屬性也就是前面的RollingFile中指定的name名稱,子節點的level也是日志輸出級別。
2)logger節點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。每個logger可以指定一個level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定時level默認為ERROR。
level:日志輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
name:用來指定該 Logger所適用的類或者類所在的包全路徑,繼承自 Root節點.
AppenderRef:Logger的子節點,用來指定該日志輸出到哪個Appender,如果沒有指定,就會默認繼承自 Root。如果指定了,那么會在指定的這個Appender和 Root的Appender中都會輸出,此時我們可以設置 Logger的 additivity="false"只在自定義的 Appender中進行輸出。
案例配置:
1.3?log4j的日志格式化api
1.3.1 api詳解
??log4j - 輸出格式控制, PatternLayout參數含義以及詳細配置 - frank_cui - 博客園?
1.3.2 演示案例
1.查看 %l
2. 查看%L
2. 查看%L
3查看%msg
?1.3.3 演示案例
%L,%line:顯示日志輸出的代碼所在的行數。Log4j在輸出行號時會檢查堆棧信息,是耗時的操作。
%c{precision},%logger{precision}:
logger名稱,precision可以是一個正整數、負整數、"1."、"1.1.."、"."等格式,用于指定輸出的logger的名稱的層級和詳細程度。
%C{precision},%class{precision}:輸出調用者的權限定類名,precision的規則與logger名稱的用法相同。Log4j在輸出類名時會檢查堆棧信息,是耗時的操作,建議使用%c{precision}或%logger{precision}代替。
%d{pattern},%date{pattern}:輸出日志事件的時間,pattern經常包含若干對包含時間/日期格式(SimpleDateFormat)的花括號。
?
%m,%msg:輸出應用中自定義的日志內容;
%M,%method:輸出方法名。Log4j在輸出行號時會檢查堆棧信息,是耗時的操作;
%n:輸出當前運行平臺所用的換行符,一般放在末尾;
%p|level{level=label, level=label, ...},%p|level{length=n}%p|level{lowerCase=true|false}:
輸出日志的級別。可以每個日志級別指定別名,如%level{WARN=W, DEBUG=D, ERROR=E, TRACE=T, INFO=I},%level{length=1}也可以實現同樣的效果,如果length的值超過了日志級別的名稱,那么使用正常的日志級別名稱。
level=label和length=n可以組合使用,如%level{ERROR=Error, length=2}為ERROR級別指定了別名,為其他日志級別限定了長度。此外,還可以指定級別的大小寫。
%T,%tid,%threadId:輸出日志的線程號,非常有必要;
%t,%tn,%thread,%threadName:輸出日志的線程名稱,類似于線程號作用相同,可選擇其中一個。https://blog.csdn.net/qq_34253002/article/details/129821103
1.4?log4j中onmatch和onmismatch的區別*
1.4.1 案例
表示匹配級別info以上的則輸出,info級別以下的不匹配則忽略。
1.4.2 onmatch的api
OnMatch和onMismatch都有3個屬性值,分別為ACCEPT,deny和neutal
Onmatch | Onmismatch |
Accept:匹配該級別以上 | Accept:匹配該級別以下 |
Deny:不匹配該級別以上 | Deny:不匹配該級別以下 |
Neutral:該級別以上的,由下一個filter處理,如果當前是最后一個,則表示匹配該級別以上。 | 該級別以及以下的,由下一個filter處理,如果當前是最后一個,則不匹配該級別以下的。 |
Log4j2的onMatch和onMismatch屬性值詳解-CSDN博客
在log4j2中,日志級別從低到高依次為: all,trace,debug,info,warn,error,fatal,off。
當設置onMismatch=neutal時,當前過濾器不會對日志事件做出接受或拒絕的決定,而是將事件傳遞給下一個過濾器處理,如果當前過濾器是最后一個,那么不匹配當前日志級別以下的事件將被忽略。
例如,第一個過濾器level設置為error且onmatch為deny,onmismatch=accept,這意味著會輸出error以下級別(warn,info,debug,trace)的日志,
當onmismatch=netral,則這些日志事件會繼續傳遞給下一個過濾器處理,而不是被當前過濾器直接處理或者忽略掉。
1.5?logback,log4j2和slf4j的區別
1)SLF4J: 是一個日志門面(抽象層),不是具體實現;提供統一的日志接口,允許用戶在部署時選擇不同的日志實現;支持多個日志實現:logback、log4j、java.util.logging等
2)Log4j: Apache的開源日志實現;Log4j 1.x已經停止維護;Log4j 2.x是完全重寫的版本
3)Logback; Log4j創始人開發的新一代日志框架;作為Log4j的繼承者,是SLF4J的原生實現。深入解析Java日志框架:Logback、Log4j 2與SLF4J的區別與使用指南_slf4j logback-CSDN博客4)推薦使用方案:
1. SLF4J + Logback(首選)
2. SLF4J + Log4j2(備選)
5)為什么選用log4j2
相比與其他的日志系統,log4j2丟數據這種情況少;disruptor技術,在多線程環境下,性能高于logback等10倍以上;利用jdk1.5并發的特性,減少了死鎖的發生;https://blog.csdn.net/weixin_44001965/article/details/143703014
對于Java工程師來說,關于日志工具的使用,最佳實踐就是在應用中使用。如log4j2 + slf4j這樣的組合來進行日志輸出。這樣做的最大好處,就是業務層的開發不需要關心底層日志框架的實現及細節,在編碼的時候也不需要考慮日后更換框架所帶來的成本。這也是日志接口(門面模式)所帶來的好處。
Log4j2使用詳解
1.6?log4j2的異常日志格式配置
https://blog.csdn.net/sz85850597/article/details/120572827
?
1.7?log4j2的異步日志配置
https://blog.51cto.com/1936625305/11823448
<loggers> ????<!--includeLocation 打印行號,如果這里不設置,就算%L 也不會打印行號--> ????<AsyncRoot level="DEBUG" includeLocation="true" > ????????<AppenderRef ref="CONSOLE"/> ????</AsyncRoot> ????<AsyncLogger?name="com.luna" level="INFO" includeLocation="true" > ????????<appender-ref ref="FILE-INFO"/> ????????<appender-ref ref="FILE-ERROR"/> ????</AsyncLogger> ????<AsyncLogger name="druid.sql.Statement" level="DEBUG" additivity="false" includeLocation="true" > ????????<appender-ref ref="CONSOLE"/> ????????<appender-ref ref="FILE-INFO"/> ????</AsyncLogger> </loggers> |