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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用详解_Log4j2使用详解

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用详解_Log4j2使用详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

日志框架簡單比較(slf4j、j.u.l、log4j、logback、log4j2 )

  • slf4j:slf4j是對所有日志框架制定的一種規范、標準、接口,并不是一個框架的具體的實現,因為接口并不能獨立使用,需要和具體的日志框架實現配合使用(如log4j、logback、log4j2)。
  • j.u.l:j.u.l是java.util.logging包的簡稱,是JDK在1.4版本中引入的Java原生日志框架。
  • log4j:log4j是apache實現的一個開源日志組件。
  • logback:logback同樣是由log4j的作者設計完成的,擁有更好的特性,用來取代log4j的一個日志框架,是slf4j的原生實現。
  • log4j2:Log4j2是log4j 1.x和logback的改進版,據說采用了一些新技術(無鎖異步等),使得日志的吞吐量、性能比log4j 1.x提高了10倍,并解決了一些死鎖的bug,而且配置更加簡單靈活。
  • 為什么需要日志接口,直接使用具體的實現不就行了嗎?
    接口用于定制規范,可以有多個實現,使用時是面向接口的(導入的包都是slf4j的包而不是具體某個日志框架中的包),即直接和接口交互,不直接使用實現,所以可以任意的更換實現而不用更改代碼中的日志相關代碼。
    對于Java工程師來說,關于日志工具的使用,最佳實踐就是在應用中使用如log4j2 + slf4j這樣的組合來進行日志輸出。這樣做的最大好處,就是業務層的開發不需要關心底層日志框架的實現及細節,在編碼的時候也不需要考慮日后更換框架所帶來的成本。這也是日志接口(門面模式)所帶來的好處。

日志級別

Log4j2中日志有六個級別(level):

  • trace:追蹤,是最低的日志級別,相當于追蹤程序的執行,一般不怎么使用
  • debug:調試,一般在開發中,都將其設置為最低的日志級別
  • info:信息,輸出重要的信息,使用較多
  • warn:警告,有些時候,雖然程序不會報錯,但是還是需要告訴程序員的
  • error:錯誤,這個在開發中也挺常用的
  • fatal:嚴重錯誤,這個一旦發生,程序基本上也要停止了

當日志級別設置為某個值的時候,低于它的日志信息將不會被記錄,只有高于設置的級別的信息會被記錄。

Spring Boot集成log4j2

1. pom.xml

Spring Boot默認使用LogBack,但是我們沒有看到顯示依賴的jar包,其實是因為所在的jar包spring-boot-starter-logging都是作為spring-boot-starter-web或者spring-boot-starter依賴的一部分。

如果這里要使用Log4j2,需要從spring-boot-starter-web中去掉spring-boot-starter-logging依賴,同時顯示聲明使用Log4j2的依賴jar包,具體如下:

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

2. log4j2.xml

  • 在application.properties中指定log4j2.xml的位置
    logging.config=classpath:log4j2.xml

如果不想在application.properties中指定log4j2.xml的位置,可以把log4j2.xml重命名為log4j2-spring.xml,這樣也是可以按照配置打印日志信息的。

  • log4j2.xml簡單示例
<?xml version="1.0" encoding="UTF-8"?> <configuration><Appenders><Console name="CONSOLE" target="SYSTEM_OUT"><PatternLayout charset="UTF-8" pattern="[%-5p] %d %c - %m%n" /></Console><File name="File" fileName="logs/file.log"><PatternLayout pattern="%m%n" /></File></Appenders><Loggers><root level="info"><AppenderRef ref="CONSOLE" /><AppenderRef ref="File" /></root></Loggers> </configuration>

3. 打印日志

只使用log4j2的話,獲取Logger對象一般是使用LogManager去獲取的,但是如果使用slf4j的話,使用LoggerFactory去獲取

private final static org.slf4j.Logger logger = LoggerFactory.getLogger(Log4j2Controller.class);logger.trace("trace level"); logger.debug("debug level"); logger.info("info level"); logger.warn("warn level"); logger.error("error level");

使用lombok插件(詳細安裝方法請上網查詢),可以簡化Logger對象的獲取,首先在相關的類上面添加@Slf4j注解(該注解由lombok提供),然后通過下面的方式打印日志:

log.trace("trace level"); log.debug("debug level"); log.info("info level"); log.warn("warn level"); log.error("error level");

log4j2配置文件詳解

1. Configuration

Configuration為根節點,有status和monitorInterval等多個屬性。

  • status的值有trace、debug、info、warn、error和 fatal,用于控制log4j2日志框架本身的日志級別,如果將status設置為較低的級別(如trace)就會看到很多關于log4j2本身的日志,如加載log4j2配置文件的路徑等信息,一般不用設置。
  • monitorInterval,含義是每隔多少秒重新讀取配置文件,可以不重啟應用的情況下修改配置。
  • name:配置名稱
  • strict: 是否使用嚴格的XML格式,推薦使用,規范開發者的配置編寫。

2. properties

properties:配置文件全局的參數變量,用于減少自定義配置信息的重復編碼,該配置是可選的,例如定義日志的存放位置D:/logs

3. Appenders

Appenders是輸出源,用于定義日志輸出的地方,log4j2支持的輸出源有很多,有控制臺Console、文件File、RollingRandomAccessFile、MongoDB、Flume等。

  • Console:控制臺輸出源是將日志打印到控制臺上,開發的時候一般都會配置,以便調試
  • File:文件輸出源,用于將日志寫入到指定的文件,需要配置輸入到哪個位置(例如:D:/logs/mylog.log)
  • RollingRandomAccessFile: 該輸出源也是寫入到文件,不同的是比File更加強大,可以指定當文件達到一定大小(如20MB)時,另起一個文件繼續寫入日志,另起一個文件就涉及到新文件的名字命名規則,因此需要配置文件命名規則 這種方式更加實用,因為你不可能一直往一個文件中寫,如果一直寫,文件過大,打開就會卡死,也不便于查找日志。
    • fileName:指定當前日志文件的位置和文件名稱
    • filePattern:指定當發生Rolling時,文件的轉移和重命名規則
    • SizeBasedTriggeringPolicy:指定當文件體積大于size指定的值時,觸發Rolling
    • DefaultRolloverStrategy:指定最多保存的文件個數
    • TimeBasedTriggeringPolicy 這個配置需要和filePattern結合使用,注意filePattern中配置的文件重命名規則是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的時間粒度是mm,即分鐘
    • TimeBasedTriggeringPolicy指定的size是1,結合起來就是每1分鐘生成一個新文件。如果改成%d{yyyy-MM-dd HH},最小粒度為小時,則每一個小時生成一個文件
  • RollingFile:同上,與RollingRandomAccessFile不同的是,RollingRandomAccessFile默認日志文件寫入策略為異步刷盤,RollingRandomAccessFile會將日志信息先寫入到緩沖區,然后緩沖區滿后刷到磁盤,并清空緩沖區,默認緩沖區的大小在8-256kb,具體大小需要自己設置。
  • NoSql:MongoDb, 輸出到MongDb數據庫中
  • Flume:輸出到Apache Flume(Flume是Cloudera提供的一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸的系統,Flume支持在日志系統中定制各類數據發送方,用于收集數據;同時,Flume提供對數據進行簡單處理,并寫到各種數據接受方(可定制)的能力。)
  • Async:異步,需要通過AppenderRef來指定要對哪種輸出源進行異步(一般用于配置RollingRandomAccessFile)

PatternLayout:控制臺或文件輸出源(Console、File、RollingRandomAccessFile)都必須包含一個PatternLayout節點,用于指定輸出文件的格式(如日志輸出的時間、文件、方法、行數等格式),例如pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n",各標記符詳細含義如下:

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

4. Loggers

日志器分根日志器Root和自定義日志器,當根據日志名字獲取不到指定的日志器時就使用Root作為默認的日志器,自定義時需要指定每個Logger的名稱name(對于命名可以以包名作為日志的名字,不同的包配置不同的級別等),日志級別level,相加性additivity(是否繼承下面配置的日志器), 對于一般的日志器(如Console、File、RollingRandomAccessFile)一般需要配置一個或多個輸出源AppenderRef。

每個logger可以指定一個level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定時level默認為ERROR。

additivity指定是否同時輸出log到父類的appender,缺省為true。

詳細配置示例

<?xml version="1.0" encoding="UTF-8"?> <configuration monitorInterval="30"><appenders><console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/></console><!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用--><File name="log" fileName="logs/test.log" append="false"><PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/></File><!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔--><RollingFile name="RollingFileInfo" fileName="logs/info.log"filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"><Filters><!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/><ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/></Filters><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile><RollingFile name="RollingFileWarn" fileName="logs/warn.log"filePattern="logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"><Filters><ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/><ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/></Filters><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 --><DefaultRolloverStrategy max="20"/></RollingFile><RollingFile name="RollingFileError" fileName="logs/error.log"filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"><ThresholdFilter level="ERROR"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile></appenders><!--然后定義logger,只有定義了logger并引入的appender,appender才會生效--><loggers><!--過濾掉spring和hibernate的一些無用的debug信息--><logger name="org.springframework" level="INFO"></logger><logger name="org.mybatis" level="INFO"></logger><root level="all"><appender-ref ref="Console"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/></root></loggers></configuration>

更多Java相關,請查看:

總結

以上是生活随笔為你收集整理的使用详解_Log4j2使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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