項目的開發過程中,開發人員對於日志一定不會陌生。日志能夠記錄程序運行的軌跡,輸出軟件運行中的關鍵信息,輔助我們排查與定位問題,優化程序運行性能,監控程序運行狀態,不可不謂重要。
SpringBoot項目的spring-boot-starter默認引用spring-boot-starter-logging,其中底層采用logback日志框架,默認零配置即可使用日志記錄功能。
在講解springboot日志配置之前先簡單談談JAVA日志有關的基礎知識。
日志記錄的時機
- 記錄程序初始化有關啟動的參數,判斷程序的運行狀態
- 代碼拋出異常,記錄程序異常狀態
- 業務流程與預期結果不符,記錄業務異常狀態
- 系統核心業務,核心權限操作。比如登錄、付款等操作記錄,通常還會入庫分析。
Java日志框架
對於日志框架,我們通常會看到log4j、logback等名詞,也會遇到自己項目與第三方jar的日志庫沖突問題。
初次接觸這些,可能有種雲霧繚繞不知所雲的感覺,下面簡單介紹下Java日志框架的關系。更具體的歷史緣由,細節部分。網上有幾篇文章介紹的很好,給大家附上自行閱讀理解:
看完以上文章簡單的總結Java日志框架分為3類:
- Java日志框架的具體的實現:log4j1.x、JUL(Java Util Log)、Logback、log4j2-core
- Java日志框架的門面對象,只提供接口不提供具體實現:JCL(Commons Logging)、SLF4J(The Simple Logging Facade for Java)、log4j2-api
- Java日志框架之間的適配器,為了讓不同日志框架互相轉換:jcl-over-slf4j、slf4j-jcl、log4j-over-slf4j、slf4j-log4j12等等
關於日志框架的最佳實踐(來源參考鏈接,這里只是摘出):
- 總是使用Log Facade,而不是具體Log Implementation
- 只添加一個 Log Implementation依賴
- 具體的日志實現依賴應該設置為optional和使用runtime scope
- 如果有必要, 排除依賴的第三方庫中的Log Impementation依賴
- 避免輸出不必要的日志,跟不必要的日志字段如行號影響程序性能
SpringBoot日志配置
日志依賴
springboot默認使用SLF4J+Logback的組合記錄日志,查看依賴可知,不用我們額外引入。
springboot日志配置
logging:
level:
#包的日志級別
org.springframework.web: DEBUG
#自定義log信息
config: classpath:config/logback-spring.xml
pattern:
#控制台的日志輸出格式
console: '%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n'
#文件的日志輸出格式
file: '%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n'
file:
#日志名稱
name: app.log
#存儲的路徑
path: /var/log/
#存儲的最大值
max-size: 50MB
#保存時間
max-history: 7
自定義的日志配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--獲取變量名中關於日志存儲的路徑與存儲名稱-->
<springProperty scope="context" name="logPath" source="logging.file.path"/>
<springProperty scope="context" name="logName" source="logging.file.name"/>
<!--輸出到控制台的appender-->
<appender name="Console"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
</Pattern>
</layout>
</appender>
<!--輸出到文件的appender-->
<appender name="RollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/${logName}</file>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
</encoder>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily and when the file reaches 10 MegaBytes -->
<fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!--開發環境基本級別為DEBUG-->
<springProfile name="dev">
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</springProfile>
<!--生產環境輸入到文件中-->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="RollingFile"/>
</root>
</springProfile>
</configuration>
千里之行,始於足下。這里是SpringBoot教程系列第八篇,所有項目源碼均可以在我的GitHub上面下載源碼。