logback是SpringBoot內置的日誌處理框架,你會發現spring-boot-starter其中包含了spring-boot-starter-logging,該依賴內容就是 Spring Boot 默認的日誌框架 logback。而spring-boot-starter-web包含了spring-boot-starter,可通過引入spring-boot-starter-web後的項目JAR依賴關係很快得出這個結論。
-
在簡單的SpringBoot項目中,我們並沒有主動去配置過任何和日誌打印的相關配置入logback.xml,但是控制檯卻打印了相關的啓動日誌。如下圖:
-
我們沒有配置任何其它配置,就可以看到來自logback root logger的輸出信息。因爲SpringBoot爲logback提供了默認的配置文件base.xml(查看源碼),base.xml文件裏定義了默認的root輸出級別爲INFO,如下:
<!-- Base logback configuration provided for compatibility with Spring Boot 1.1 --> <included> <include resource="org/springframework/boot/logging/logback/defaults.xml" /> <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/> <include resource="org/springframework/boot/logging/logback/console-appender.xml" /> <include resource="org/springframework/boot/logging/logback/file-appender.xml" /> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> </included>
-
默認情況下,Spring Boot將日誌輸出到控制檯,不會寫到日誌文件
-
使用SpringBoot在application.properties或application.yml中只能配置簡單的場景。保存路徑、日誌格式等,複雜的場景(區分 info 和 error 的日誌、每天產生一個日誌文件等)滿足不了,只能自定義配置。
-
最後附上常用的logback-spring.xml模板:
<property name="MDC_LOG_PATTERN" value="%red(%d{yyyy-MM-dd'T'HH:mm:ss.SSS}) %green(%p filesystem %t) %blue(%logger{50}) %yellow([line:%L %msg]%n)"></property> <!--定義項目中日誌輸出位置: 控制檯--> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <!--定義項目的日誌輸出格式--> <layout class="ch.qos.logback.classic.PatternLayout"> <!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%thread] %logger{35} - %msg%n</pattern>--> <pattern>${MDC_LOG_PATTERN}</pattern> </layout> </appender> <!--定義項目中日誌輸出位置: 文件存儲--> <appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>./log/ace/jpy.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>./log/ace/jpy.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%thread] %logger{35} - %msg%n</pattern> </encoder> </appender> <!--定義項目中日誌輸出位置: 文件存儲 INFO--> <appender name="logFileInfo" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>./log/ace/info/jpy-info.log</file> <!--日誌級別過濾--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--只匹配對應級別日誌--> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>./log/ace/info/jpy-info.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%thread] %logger{35} - %msg%n</pattern> </encoder> </appender> <!--定義項目中日誌輸出位置: 文件存儲 WARN--> <appender name="logFileWarn" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>./log/ace/warn/jpy-warn.log</file> <!--日誌級別過濾--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--只匹配對應級別日誌--> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>./log/ace/warn/jpy-warn.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%thread] %logger{35} - %msg%n</pattern> </encoder> </appender> <!--定義項目中日誌輸出位置: 文件存儲 ERROR--> <appender name="logFileError" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>./log/ace/error/jpy-error.log</file> <!--日誌級別過濾--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--只匹配對應級別日誌--> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>./log/ace/error/jpy-error.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%thread] %logger{35} - %msg%n</pattern> </encoder> </appender> <!--項目中根日誌控制--> <root level="INFO"> <appender-ref ref="logFile"/> <appender-ref ref="logFileInfo"/> <appender-ref ref="logFileWarn"/> <appender-ref ref="logFileError"/> <appender-ref ref="stdout"/> </root> <!--項目中指定包日誌控制--> <!-- <logger name="cool.jpy" level="INFO"/>--> <logger name="cool.jpy" additivity="false"> <appender-ref ref="logFile"/> <appender-ref ref="logFileInfo"/> <appender-ref ref="logFileWarn"/> <appender-ref ref="logFileError"/> <appender-ref ref="stdout"/> </logger> </configuration>
-