日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot Log4j2 日志学习

發布時間:2023/12/9 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot Log4j2 日志学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

Java 中比較常用的日志工具類,有:

  • Log4j、
  • SLF4j、
  • Commons-logging(簡稱jcl)、
  • Logback、
  • Log4j2(Log4j 升級版)、
  • Jdk Logging

Spring Boot 默認使用 Logback,但相比較而言,Log4j2 在性能上面會更好。SpringBoot 高版本都不再支持 log4j,而是支持 log4j2。log4j2,在使用方面與 log4j 基本上沒什么區別,比較大的區別是 log4j2 不再支持 properties 配置文件,支持 xml、json 格式的文件。

  • Github-apache/logging-log4j2
  • 官方文檔

log4j2 安裝

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions> <!-- 去掉logback配置 --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><dependency> <!-- 引入log4j2依賴 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency> </dependencies>

log4j2 使用

// 這幾種寫法都 OK private static final Logger logger = LoggerFactory.getLogger(this.getClass()); private static final Logger logger = LogManager.getLogger(UserController.class); //... logger.debug("this is debug"); logger.info("this is info");

log4j2.xml 示例

配置文件的主要結構如下:

  • Appenders:
    • Appender
      • Filter
      • Layout
      • Policies
      • Strategy
  • Loggers
    • Logger
    • RootLogger

Github 配置地址:SpringBoot-Note/mybatis-demo/src/main/resources/log4j2.xml

Appender

簡單說 Appender 就是一個管道,定義了日志內容的去向(保存位置)。

  • 配置一個或者多個Filter。
  • 配置 Layout 來控制日志信息的輸出格式。
  • 配置 Policies 以控制日志何時(When)進行滾動。
  • 配置 Strategy 以控制日志如何(How)進行滾動。

Appender 官宣

注意點:

  • 多個 appender 不能指向同一個日志文件,否則會報錯:Configuration has multiple incompatible Appenders pointing to the same resource 'logs/mybatis-demo-warn.log'
  • ImmediateFlush=true,一旦有新日志寫入,立馬將日志寫入到磁盤的文件中。當日志很多,這種頻繁操作文件顯然性能很低下
  • immediateFlush:log4j2接收到日志事件時,是否立即將日志刷到磁盤。默認為true。
  • BufferedIO: 文件流寫出是否使用緩沖,true表示使用,默認值為false即不使用緩沖。測試顯示,即使在啟用immediateFlush的情況下,設置bufferedIO=true也能提高性能。
  • 一個 LogConfig 可以使用多個 appender,一個 appender 也可以被多個 LogConfig 使用

Filter

Filters 決定日志事件能否被輸出。過濾條件有三個值:ACCEPT(接受),DENY(拒絕),NEUTRAL(中立)。

常用的Filter實現類有:

  • LevelRangeFilter
  • TimeFilter
  • ThresholdFilter

簡單說就是log4j2中的過濾器 ACCEPT 和 DENY 之后,后續的過濾器就不會執行了,只有在 NEUTRAL 的時候才會執行后續的過濾器

<Console name="Console"><!--設置 onMismatch="NEUTRAL" 可以讓日志經過后續的過濾器最后一個過濾器建議設置 onMismatch="DENY", 不然日志就輸出了。--><Filters><!-- 從大到小:error, warn, info, debug, trace --><LevelRangeFilter minLevel="error" maxLevel="info" onMatch="ACCEPT" onMismatch="NEUTRAL" /><!-- 只允許在每天的 8點~8點半 之間輸出日志 --><TimeFilter start="08:00:00" end="08:30:00" onMatch="ACCEPT" onMismatch="DENY" /></Filters><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/> </Console>

LevelRangeFilter 對它們進行了 ACCEPT,而剩下的 trace Msg 和 debug Msg 則會經過下一個過濾器

PatternLayout

這是常用的日志格式化類,其它日志格式化類很少用。

<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>

常用說明:

%d{HH:mm:ss.SSS} 表示輸出到毫秒的時間 %t 輸出當前線程名稱 %-5level 輸出日志級別,-5表示左對齊并且固定輸出5個字符,如果不足在右邊補0 %logger 輸出logger名稱,因為Root Logger沒有名稱,所以沒有輸出 %msg 日志文本 %n 換行其他常用的占位符有: %F 輸出所在的類文件名,如Client.java %L 輸出行號 %M 輸出所在方法名 %l ?輸出語句所在的行數, 包括類名、方法名、文件名、行數

關于 pattern 的格式點擊:

  • http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

Policy

Policy & Strategy

  • Policy 是用來控制日志文件何時(When)進行 Rolling/滾動的;
  • Strategy是用來控制日志文件如何(How)進行 Rolling/滾動的。

所謂「日志滾動」就是當達到設定的條件后,日志文件進行切分。比如:工程師想讓系統中的日志按日進行切分,并且按月歸檔。

Rolling 的意思是當滿足一定條件后,就重命名原日志文件用于備份,并重新生成一個新的日志文件。例如需求是每天生成一個日志文件,但是如果一天內的日志文件體積已經超過 1G,就重新生成。兩個條件滿足一個即可

Policy常用的實現類:

  • SizeBasedTriggeringPolicy,根據日志文件的大小進行滾動。單位有:KB,MB,GB
  • CronTriggeringPolicy,使用 Cron 表達式進行日志滾動,很靈活
  • TimeBasedTriggeringPolicy,這個配置需要和filePattern結合使用,注意 filePattern 中配置的文件重命名規則。滾動策略依賴于 filePattern 中配置的最具體的時間單位,根據最具體的時間單位進行滾動。這種方式比較簡潔。CronTriggeringPolicy 策略更強大
    • 在 TimeBasedTriggeringPolicy 標簽中加上了 modulate 屬性并設置為 true,該屬性的意思是是否對日志生成時間進行調制。若為 true,則日志時間將以 0 點為邊界進行偏移計算。例如第一次日志保存時間是 3 點,modulate為 true,interval 是 4h。那么下次生成日志時間是 4點,08:00,12:00……。
<Appenders><RollingRandomAccessFile name="File" fileName="logs/app.log"filePattern="logs/$${date:hh-mm}/%d{hh-mm-ss}.app.%i.log" ><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/><Policies><!-- 每 5s 翻滾一次 --><!--<CronTriggeringPolicy schedule="0/5 * * * * ?" />--><!--filePattern中最具體的時間單位是 秒。這里用 TimeBasedTriggeringPolicy 替換 CronTriggeringPolicy注意:modulate屬性是指從啟動時間開始算5秒,還是從0秒開始算5秒,運行一下就明白了。modulate: true(默認值) // 會從啟動時間開始算 5秒modulate: false // 從 0秒開始算--><TimeBasedTriggeringPolicy interval="5" modulate="true"/><SizeBasedTriggeringPolicy size="10 MB"/></Policies><DefaultRolloverStrategy max="10" /></RollingRandomAccessFile> </Appenders>

Strategy

Strategy常用的實現類:

  • DefaultRolloverStrategy
  • DirectWriteRolloverStrategy

這兩個 Strategy 都是控制如何進行日志滾動的。

DefaultRolloverStrategy 默認的 max為 7。

<DefaultRolloverStrategy max="7"/>

max 參數指定了計數器的最大值。一旦計數器達到了最大值,過舊的文件將被刪除。

注意:不要認為 max 參數是需要保留的日志文件的最大數目。

max 參數是與 filePattern 中的計數器 %i 配合起作用的,其具體作用方式與 filePattern 的配置密切相關。

1.如果filePattern中僅含有date/time pattern,每次rollover時,將用當前的日期和時間替換文件中的日期格式對文件進行重命名。max參數將不起作用。

如,filePattern="logs/app-%d{yyyy-MM-dd}.log"

2.如果 filePattern 中僅含有整數計數器(即%i ),每次 rollover 時,文件重命名時的計數器將每次加1(初始值為1),若達到 max 的值,將刪除舊的文件。

如,filePattern="logs/app-%i.log"

3.如果 filePattern 中既含有 date/time pattern,又含有 %i,每次 rollover 時,計數器將每次加 1,若達到 max 的值,將刪除舊的文件,直到 data/time pattern 不再符合,被替換為當前的日期和時間,計數器再從1開始。

如,filePattern="logs/app-%d{yyyy-MM-dd HH-mm}-%i.log"

Appender 類型

FileAppender(File)、RandomAccessFileAppender(RandomAccessFile)

  • 相同點:寫入日志信息到文件
  • 不同點:使用的 I/O 實現類不同,前者使用 FileOutputStream,后者使用 RandomAccessFile。

官方文檔說是在 bufferedIO=true (默認是 true )的情況下,性能提升 20% ~ 200%。

常用屬性:

  • fileName:來指定文件位置,文件或目錄不存在則會自動創建。
  • immediateFlush:是否每次寫入都要立刻刷新到硬盤中。默認 true,如果使用默認值可能會影響性能。

RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)

  • 相同點:寫入日志信息到文件
  • 不同點:使用的 I/O 實現類不同,前者使用 FileOutputStream,后者使用 RandomAccessFile。
  • 上一對的實現類不能進行「日志滾動」,而帶有 rolling 字樣的 appender 就可以實現「滾動」功能。有「滾動」,會判斷是否滿足封存文件的要求,執行日志存檔操作。

RollingRandomAccessFile Appender,相比 RollingFileAppender有很大的性能提升,官網宣稱是20-200%

<RollingRandomAccessFile name="File" fileName="logs/app.log"filePattern="logs/$${date:hh-mm}/%d{hh-mm-ss}.app.%i.log" ><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/><Policies><!-- 每 5s 翻滾一次 --><CronTriggeringPolicy schedule="0/5 * * * * ?" /><SizeBasedTriggeringPolicy size="10 MB"/></Policies><DefaultRolloverStrategy max="10" /> </RollingRandomAccessFile> </Appenders>

常用屬性:

  • filePattern:指定當發生Rolling時,文件的轉移和重命名規則。至于其中的 $${date:hh-mm} 是表示了一個文件夾(以 小時-分鐘)命名。
  • DefaultRolloverStrategy 指定了如何(How)進行翻滾,并且指定了最大翻滾次數(影響%i參數值),超過次數之后會按照相應的規則刪除舊日志。
  • Policies: 這里就是規定了何時進行滾動(When),可以有多個Policy。
    • CronTriggeringPolicy,比如設置每 5s 進行一次翻滾
    • SizeBasedTriggeringPolicy 指定當文件體積大于size指定的值時,觸發Rolling。例如,如果當前文件超過了 10MB,但是文件的名字還沒有進行翻滾(建立新文件),那么就會用%i的方式進行翻滾。

如果配置的是 RollingFile 或 RollingRandomAccessFile,則必須配置一個 Policy。

翻滾理解

假設計數器次數設為2次 <DefaultRolloverStrategy max="2" />,filePattern 中既含有 date/time pattern,又含有 %i。

當滿足翻滾觸發條件時(時間間隔到了 OR 文件大小超了),就會啟動 Rolling:

app.log

第一次翻滾:app.log app.1.log // app.log -> app.1.log
第二次翻滾:app.log app.1.log app.2.lop // app.log -> app.2.log

一個循環結束,到達了最大保存數 2 了,那么,app1.log 會被刪除,下一個 app3.log 就會覆蓋 app2.log,app2.log會改名為app1.log

第三次翻滾:app.log app.2.lop app.3.lop // app.log -> app.3.log
第四次翻滾:app.log app.3.lop app.4.lop // app.log -> app.4.log

理解:編號最近的一次也就是最新的一次 log,而采取了 Policy 方式的日志,fileName 中保存的日志將不會是全量的日志,而是根據你 Policy 的條件切分后的最近一次的日志內容。

  • 博客園-Log4j2中RollingFile的文件滾動更新機制 滾動機制介紹的很詳細
  • CSDN-log4j2教程【RollingFileAppender】

一個 Appender 示例

按月歸檔日志,按日進行切分,限制單文件大小為 500MB, 一天最多生成20個文件,也就是(20 * 500)MB大小的日志

<?xml version="1.0" encoding="UTF-8"?> <Configuration name="baseConf" status="warn" monitorInterval="30"><Appenders><RollingRandomAccessFile name="File" fileName="logs/app.log"filePattern="logs/$${date:yyyy-MM}/%d{yyyy-MM-dd}.app.%i.log" ><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/><Policies><TimeBasedTriggeringPolicy interval="1" modulate="false"/><SizeBasedTriggeringPolicy size="500MB"/></Policies><DefaultRolloverStrategy max="20" /></RollingRandomAccessFile></Appenders><Loggers><Root level="info"><AppenderRef ref="File"/></Root></Loggers></Configuration>

Logger

簡單說Logger就是一個路由器,指定類、包中的日志信息流向哪個管道,以及控制他們的流量(日志級別)

Logger 部分為兩個Logger:

  • Root(必須配置)
  • Logger

注意:Logger中也可以加過濾器的

日志重復打印問題

如果 Root 中的日志包含了 Logger 中的日志信息,并且 AppenderRef 是一樣的配置,則日志會打印兩次。

這時候我們需要使用一個 Logger 的屬性來解決,那就是 additivity,其默認值為 true,需要配置為false

<?xml version="1.0" encoding="UTF-8"?> <Configuration name="baseConf" status="warn" monitorInterval="30"><Appenders><Console name="Console"><PatternLayout><Pattern>%d %p %c{1.} [%t] %m%n</Pattern></PatternLayout></Console></Appenders><Loggers><Logger name="me.master.snail.log.LogMain" level="info" additivity="false"><AppenderRef ref="Console"/></Logger><Root level="trace"><AppenderRef ref="Console"/><Filters><LevelRangeFilter minLevel="error" maxLevel="info" onMatch="ACCEPT" onMismatch="DENY" /></Filters></Root></Loggers> </Configuration>
  • Root Logger 只能有一個,普通的 Logger 可以定義多個,可以細致到給某個類定義;
  • 多個 Logger 配置重復了,在日志文件中會重復;
  • 每一個 Logger 對應的 name 是包路徑,含義是,在 name 包下的類使用 AppenderRef 指向的日志模板來輸出日志。
  • 不同的LogConfig之間其實是有繼承關系的,子LogConfig 會繼承 parent 的屬性,而所有 LogConfig 都繼承自 Root LogConfig。所以即使只配置了root logger,你一樣可以在任何地方通過 LoggerFactory.getLogger 獲取一個 logger 對象,記錄日志
  • 先配置一個root,讓所有需要使用日志的logger繼承,然后對有特別需要的logger進行特殊的配置,比如我們希望org.springframework包只記錄error以及warn級別的log,再比如,我們希望能顯示mybatis執行的sql的日志,都可以進行個性化的配置

Logger 等級實驗

<logger name="org.springframework" level="INFO" additivity="true"><AppenderRef ref="InfoLog"/> </logger><Root level="ERROR" additivity="true"><AppenderRef ref="Console"/><AppenderRef ref="InfoLog"/><AppenderRef ref="WarnLog"/><AppenderRef ref="ErrorLog"/> </Root>
  • ROOT 等級設為 ERROR 時,org.springframework Logger 等級設為 OFF 時,發現原來的 warn.log 和 info.log 文件中,都只有級別大于或等于 ERROR 的日志信息了;
  • ROOT 等級設為 ERROR 時,org.springframework Logger 等級設為 INFO 時,發現info.log 文件中,增加了 org.springframework 包的相關 INFO 級別的日志信息了;

總結

  • Logger 日志等級和 appender 日志等級的關系:logger 日志等級和 appender 日志登記,誰「高」聽誰的;
  • 普通 Logger 的優先級高

參考

  • 掘金-zdran-Spring Boot 學習筆記(二) 整合 log4j2 博主寫了Spring Boot 教程
  • 王磊的博客-Spring Boot(十)Logback和Log4j2集成與日志發展史 介紹了 SpringBoot 和 log4j2 的結合
  • 博客園-蝸牛大師-淺談Log4j2日志框架及使用 介紹的非常詳細,推薦
  • CSDN-Log4j2使用 介紹的很詳細
  • 博客園-Log4j2之Appenders 對 appender 介紹詳細
  • SpringBoot + Log4j2使用配置 異步日志介紹的比較多
  • CSDN-詳解log4j2(下) - Async/MongoDB/Flume Appender 按日志級別區分文件輸出 介紹了一下不常用的用法,比如將日志存到數據庫中

轉載于:https://www.cnblogs.com/michael-xiang/p/10582300.html

總結

以上是生活随笔為你收集整理的Spring Boot Log4j2 日志学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。