2021年8月9日 星期一

slf4j 搭 log4j2 並進行基本操作

利用 slf4j 搭配 log4j2 進行基本操作,主要展示輸出到 console 和輸出到檔案兩種方式


環境

Intellij IDEA 2021.1

提要

設定檔的檔名 log4j2 是一個預設值,log4j2 固定會讀這個檔名。

文中的以時間區分生成 log 檔跟以檔案大小生成 log 可以同時用。

本文


1.目錄結構如下




2.上 MVNRepository (https://mvnrepository.com/) 取得 slf4j + log4j2 的 dependency,並複製到 pom.xml 下 (記得要 reload maven project)


pom.xml
  1. <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
  2. <dependency>
  3. <groupId>org.apache.logging.log4j</groupId>
  4. <artifactId>log4j-slf4j-impl</artifactId>
  5. <version>2.14.1</version>
  6. <scope>test</scope>
  7. </dependency>


3.測試用的程式碼


App.java
  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3. public class App {
  4. private static Logger logger = LoggerFactory.getLogger(App.class);
  5. public static void main(String[] args) throws InterruptedException {
  6. while (true){
  7. logger.trace("Trace message");
  8. logger.debug("Debug message");
  9. logger.info("Info message");
  10. logger.warn("Warn message");
  11. logger.error("error message");
  12. Thread.sleep(100);
  13. }
  14. }
  15. }


4. 設定檔 log4j2.propertiest,主要呈現輸出到 console 和輸出到檔案兩種方式


log4j2.properties
  1. # consolelala 這個是自取的名稱,用意在表示這些設定屬於同一個 appender
  2. # type:這個 appender 的類型
  3. # name:名稱自定,在指定 logger 要連結那些 appender 時會用到
  4. # layout.type:指定輸出的方式,有 HTMLLayout、PatternLayout、SimpleLayout、TTCCLayout 四種
  5. # layout.pattern:PatternLayout 用的 pattern
  6. # filter.threshold.type:指定 filter 的類型
  7. # filter.threshold.level:指定 filter 要輸出何種層級的 log(ex. error),預設應該是 error 層級,
  8. # 設定應該會跟 filter 的類型有關
  9. # 輸出到 console
  10. appender.consolelala.type = Console
  11. appender.consolelala.name = myconsoleappender
  12. appender.consolelala.layout.type = PatternLayout
  13. appender.consolelala.layout.pattern = [%d{yy-MMM-dd HH:mm:ss:SSS}] [%p] [%c{1}:%L] - %m%n
  14. appender.consolelala.filter.threshold.type = ThresholdFilter
  15. appender.consolelala.filter.threshold.level = trace
  16. appender.consolelala.ImmediateFlush=true
  17. # log 輸出到檔案,RollingFile 會依照時間或檔案大小來做 rollover
  18. # type:RollingFile 輸出到檔案
  19. # fileName:存放 log 的檔名
  20. # append:重啟時是否要清空 log 檔案,還是附加在現有檔案
  21. # policies.type:當 appender 的 type 不同時,會有不同的策略,也有不同的設定值要設定
  22. # policies.time.type:TimeBasedTriggeringPolicy 表示用時間觸發生成 log 的方式
  23. # policies.time.interval:當設定以(ex.日/時/分),來生成 log 時,interval 可以設定是要以
  24. # n 日/n 時/n 分來生成 log
  25. # policies.time.modulate:設定當在計算每隔 interval 生成 log 時,是要從 logger 開始的時間
  26. # 後間隔 interval 生成 log 還是從 0 開始算 (ex.0點 or 0分)
  27. # filePattern:RollingFile 會以時間或檔案大小來生成 log,所以比方說隔日,或是檔案超過指定的大小時,會
  28. # 依照這個 filePattern 指定的檔名去生成 log,決定要依照每天或每小時或每分鐘去生成
  29. # 當設定包含到小時或分鐘時,就會變成依小時或依分鐘生成 log
  30. # 以日分(%d{yyyy-MM-dd})、以小時分(%d{yyyy-MM-dd-hh})、以分鐘分(%d{yyyy-MM-dd-hh-mm})
  31. # 也可以設定 (%d{yyyy-MM-dd-hh-mm-ss}) 到秒,不過沒什麼意義
  32. # 注意表示小時的hh有分小寫(12時制)大寫(24時制)
  33. # filter.threshold.type:filter 的類型
  34. # filter.threshold.level:表示只輸出 trace 及比 trace 更嚴重的層級的 log,這邊是第二道設定,從
  35. # logger 那邊的 level 設定要大於這邊的設定才有意義
  36. # (不嚴重) trace < debug < info < warn < error (嚴重)
  37. # 輸出到 file (依時間生成 log)
  38. appender.rollingdaylog.type = RollingFile
  39. appender.rollingdaylog.name = daylog
  40. appender.rollingdaylog.fileName = E:/logtest/daily.log
  41. appender.rollingdaylog.filePattern = E:/logtest/daily-%d{yyyy-MM-dd-HH-mm}.log
  42. appender.rollingdaylog.layout.type = PatternLayout
  43. appender.rollingdaylog.layout.pattern = [%d{yy-MMM-dd HH:mm:ss:SSS}] [%p] [%c{1}:%L] - %m%n
  44. appender.rollingdaylog.append = false
  45. appender.rollingdaylog.policies.type = Policies
  46. appender.rollingdaylog.policies.time.type = TimeBasedTriggeringPolicy
  47. appender.rollingdaylog.policies.time.interval = 3
  48. appender.rollingdaylog.policies.time.modulate = true
  49. appender.rollingdaylog.filter.threshold.type = ThresholdFilter
  50. appender.rollingdaylog.filter.threshold.level = trace
  51. # filePattern:這邊的有多設定一個「-%i」,當log檔大小大於預設要生成時,若檔名重複,這個 「-%i」是
  52. # 一個流水號
  53. # policies.size.type:SizeBasedTriggeringPolicy 表示採用 log 檔案大小做生成的依據
  54. # policies.size.size:設定檔案大於此大小做生成(ex. 1KB, 1MB, ...)
  55. # strategy.min:當 log 生成時 -%i 流水號的值,從 strategy.min 到 strategy.max
  56. # 也就表示只會保留從 min 到 max 這個範圍的數量的 log。如果 filePattern 設定到分鐘,min=1,min=5
  57. # 則每分鐘就最多 1 ~ 5 個 log 檔,較舊的會被蓋掉(會自動更名)
  58. # strategy.max
  59. # ImmediateFlush:表示不做緩衝,直接輸出到 log,較吃 i/o 效能,實際上吃多少視 log 生成速度
  60. # 輸出到 file (依檔案大小生成 log)
  61. appender.rolling2.type = RollingFile
  62. appender.rolling2.name = errorLog
  63. appender.rolling2.fileName = E:/logtest/error.log
  64. appender.rolling2.filePattern = E:/logtest/errorlog-%d{yyyy-MM-dd-HH-mm-ss}-%i.log
  65. appender.rolling2.layout.type = PatternLayout
  66. appender.rolling2.layout.pattern = [%-5p] [%d{yyyy/MM/dd HH:mm:ss:SSS} %C-%M] : %m%n
  67. appender.rolling2.append = true
  68. appender.rolling2.policies.type = Policies
  69. appender.rolling2.policies.size.type = SizeBasedTriggeringPolicy
  70. appender.rolling2.policies.size.size = 10KB
  71. appender.rolling2.strategy.type = DefaultRolloverStrategy
  72. appender.rolling2.strategy.min = 1
  73. appender.rolling2.strategy.max = 5
  74. appender.rolling2.ImmediateFlush = true
  75. appender.rolling2.filter.threshold.type = ThresholdFilter
  76. appender.rolling2.filter.threshold.level = error
  77. # rootLogger:透過 LoggerFactory.getLogger 生成的 logger 在沒有父 logger
  78. # 的時候統一繼承 rootLogger 的設定值
  79. # rootLogger.level:定義 rootLogger 要輸出什麼層級的 log
  80. # rootLogger.appenderRef:定義 rootLogger 要接上那些 appender (consolelogdemo、filelogdemo 自己命名就好)
  81. # rootLogger 生
  82. rootLogger.level = trace
  83. # 指定要輸出到 console
  84. rootLogger.appenderRef.consolelogdemo.ref = STDOUT
  85. # 指定要輸出到 file
  86. rootLogger.appenderRef.filelogdemo.ref = daylog
  87. # 指定要輸出到 file,且因為 errorLog 這個 appender 設定 filter 的關係,這個 appender 等於專門輸出 error
  88. rootLogger.appenderRef.filelogdemo2.ref = errorLog


5. xml 版本的設定檔 (多補一個同時使用時間和大小分log的)


log4j2.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="info" name="Log4j2PropertiesConfig">
  3. <Appenders>
  4. <!--輸出到 console-->
  5. <Console name="myconsoleappender" ImmediateFlush="true">
  6. <PatternLayout pattern="[%d{yy-MMM-dd HH:mm:ss:SSS}] [%p] [%c{1}:%L] - %m%n" />
  7. <ThresholdFilter level="trace" />
  8. </Console>
  9. <RollingFile name="daylog" fileName="E:/logtest/daily.log"
  10. filePattern="E:/logtest/daily-%d{yyyy-MM-dd-HH-mm}.log">
  11. <PatternLayout>
  12. <Pattern>[%d{yy-MMM-dd HH:mm:ss:SSS}] [%p] [%c{1}:%L] - %m%n</Pattern>
  13. </PatternLayout>
  14. <Policies>
  15. <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
  16. </Policies>
  17. </RollingFile>
  18. <!--每分鐘生成一個 log 檔 (輸出到檔案)-->
  19. <RollingFile name="errorlog" fileName="E:/logtest/error.log"
  20. filePattern="E:/logtest/errorlog-%d{yyyy-MM-dd-HH-mm}-%i.log">
  21. <PatternLayout pattern="[%d{yy-MMM-dd HH:mm:ss:SSS}] [%p] [%c{1}:%L] - %m%n" />
  22. <ThresholdFilter level="error"/>
  23. <Policies>
  24. <SizeBasedTriggeringPolicy size="10 KB"/>
  25. </Policies>
  26. <DefaultRolloverStrategy min="1" max="5"/>
  27. </RollingFile>
  28. <!--每分鐘或檔檔案大於 1mb 時生成 log 檔,每分鐘最多保留 5 個-->
  29. <RollingFile name="errorlog2" fileName="E:/logtest/error2.log"
  30. filePattern="E:/logtest/errorlog2-%d{yyyy-MM-dd-HH-mm}-%i.log">
  31. <PatternLayout pattern="[%d{yy-MMM-dd HH:mm:ss:SSS}] [%p] [%c{1}:%L] - %m%n" />
  32. <ThresholdFilter level="error"/>
  33. <Policies>
  34. <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
  35. <SizeBasedTriggeringPolicy size="1 MB"/>
  36. </Policies>
  37. <DefaultRolloverStrategy min="1" max="5"/>
  38. </RollingFile>
  39. </Appenders>
  40. <Loggers>
  41. <Root level="trace" includeLocation="false">
  42. <AppenderRef ref="myconsoleappender" />
  43. <AppenderRef ref="daylog"/>
  44. <AppenderRef ref="errorlog"/>
  45. </Root>
  46. </Loggers>
  47. </Configuration>
  48.  

沒有留言:

張貼留言