1.SpringBoot使用的默認日誌框架是Logback,並用INFO級別輸出到控制檯:
日誌輸出內容元素具體如下:
時間日期:精確到毫秒
日誌級別:ERROR,WARN,INFO,DEBUG,TRACE
進程ID
分隔符:--標識實際日誌的開始
線程名:方括號括起來(可能會階段控制檯輸出)
Logger名:通常使用源代碼的類名
日誌內容
日誌依賴:該依賴內容就是SpringBoot默認的日誌框架logback,不需要另外導入,已經默認導入了。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> |
日誌級別(從低到高):
TRACE < DEBUG < INFO < WARN < ERROR < ALL < OFF
如果設置爲WARN,那麼低於WARN的信息都不會輸出
以下配置需要在application.properties文件中設置
##root日誌以WARN級別輸出
logging.level.root=WARN(讓日誌只輸出warn及以上級別的信息)
##springframework.web 日誌以DEBUG級別輸出
logging.level.org.springframework.web=DEBUG
##hibernate 日誌以ERROR級別輸出
logging.level.org.hibernate=ERROR
默認情況下,SpringBoot將日誌輸出到控制檯,不會寫到日誌文件中。如果要編寫除控制檯輸出之外的日誌文件,則需要application.properties中設置logging.file 或者logging.path屬性
logging.file=log/my.log(相對)或logging.file=/log/my.log(絕對)
logging.path設置目錄,會在該目錄下創建spring.log文件,並寫入日誌內容,如logging.path=/var/log
如果只配置logging.file, 會在項目的當前路徑下生成一個xxx.log日誌文件。
如果只配置logging.path, 會在/var/log文件夾下生成日誌文件spring.log
注意:二者不可同時使用,若同時使用,則只有logging.file生效
默認情況下,日誌文件的大小達到10MB時,會切分一次,產生新的日誌文件,默認級別爲:ERROR, WARN, INFO
logging.level.root=WARN logging.level.org.springframework.web=DEBUG logging.file=d:/log/info.log ##控制檯顯示日誌的格式 logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n ##文件顯示日誌的格式 logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n |
2. 自定義日誌配置
可以使用其他系統對日誌進行配置
<?xml version="1.0" encoding="UTF-8"?> <!-- scan表示當配置文件發生變化時,會進行重新加載 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <contextName>logback</contextName> <property name="log.path" value="d:/log/info.log" /> <!-- 輸出到控制檯 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 輸出到文件 --> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingFileAppender"> <!-- 日誌切分方式,每一天的日誌歸併到同一天 --> <fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root>
<!-- logback爲java中的包 --> <logger name="cn.huangwei.controller" /> <!-- additivity是否向上級logger傳遞打印信息 --> <logger name=" cn.huangwei.controller.SpringTestController" level="WARN" additivity="false"> <appender-ref ref="console"/> </logger> </configuration> |
scan:配置文件如果發生變化,將會重新加載,默認值爲true;
scanPeriod:設置檢測配置文件的時間間隔,默認單位毫秒,默認間隔1分鐘。
debug:設置爲true時,將打印出logback內部日誌信息。默認爲false
contextName標籤:一旦設置不能更改,可以通過%contextName來獲取上下文名稱
logger的使用:
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<!-- logback爲java中的包 -->
<logger name="cn.huangwei.controller" />
<!-- additivity是否向上級logger傳遞打印信息 -->
<logger name="cn.huangwei.controller.SpringTestController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
第一個logger只指定了包名,這樣控制了這個包下面的所有文件的日誌的打印。這裏的打印級別沒有單獨設置,故默認與上一級別一致,即root中的info級別,而root中的可以向console和file輸出日誌信息,默認爲console輸出。
例如新建一個TestController
package cn.huangwei.controller;
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class TestController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("/show") @ResponseBody public String show() { logger.debug("debug日誌"); logger.info("info日誌"); logger.warn("warn日誌"); logger.error("error日誌"); return "show"; } } |
該文件是在cn.huangwei.controller包下面的文件,沒有設置level,故使用root上級的日誌級別,沒有設置additity,故默認爲true,向上傳遞。故遵循上一級root的日誌輸出方式,輸出info及info以上級別的日誌,默認輸出控制檯上。
運行項目,在地址欄輸入localhost:8080/show,查看控制檯的日誌輸出
<!-- additivity是否向上級logger傳遞打印信息 -->
<logger name="cn.huangwei.controller.SpringTestController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
第二個logger,對於SpringTestController文件,打印warn及warn級別以上的日誌,additivity爲false表示不向上級傳遞日誌信息,它的繼承關係爲cn.huangwei.controller.SpringTestController的上一級爲cn.huangwei.controller,cn.huangwei.controller的上一級爲root;自身通過console打印日誌信息
修改SpringTestController類;所以當SpringTestController接收到日誌消息時,自身進行打印,上級cn.huangwei.controller的logger沒有收到消息,就不需要向上傳遞,故只打印一份日誌。
運行之後得到結果
如果將additivity設置爲true,需要向上級傳遞,由上級來執行日誌信息;結果爲
分析:SpringTestController的上一級是cn.huangwei.controller,cn.huangwei.controller的上一級是root,當SpringTestController收到日誌消息時,自身通過appender打印消息,然後向上級cn.huangwei.controller傳遞,由於該logger沒有level,沒有additity,沒有appender,就委託給它上級root打印日誌消息,因此日誌消息打印第二遍。
問:logger的繼承關係(上下級)怎麼判斷?
是根據logger的name屬性中“.”點號分隔符進行判斷的,例如cn.huangwei是cn.huangwei.controller的上級,如果沒有點號例如huangwei,那麼他的上級是root。
<!-- 根logger,第一級 --> <root level="info"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root>
<!-- logger爲java中的包下日誌管理,additivity默認爲true --> <logger name="cn.huangwei.controller" level="debug"/> <!-- additivity是否向上級logger傳遞打印信息 --> <logger name="cn.huangwei" level="warn" additivity="false"> <appender-ref ref="console"/> </logger> |
日誌輸出結果爲:
問:繼承關係中的上下級日誌等級問題?
如果日誌消息對應的logger有level屬性,按照level屬性來,如果沒有,按照上級的level屬性來,如果連root都沒有,默認debug。