1. 程式人生 > >Spring Boot(08)——日誌輸出

Spring Boot(08)——日誌輸出

日誌輸出

使用了spring-boot-starter後,將新增spring-boot-starter-logging依賴,此時Spring Boot將使用logback進行日誌輸出,預設只會輸出INFO級別以上的日誌資訊,且只會輸出到控制檯。預設的日誌格式是如下這樣的。前面是日誌輸出時間,INFO是日誌級別,7496是程序號,[ost-startStop-1]是用[]包起來的執行緒名,o.s.web.context.ContextLoader是日誌名稱,接下來冒號後面的內容就是真正的日誌資訊。

2018-07-06 16:03:13.083  INFO 7496 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2954 ms
2018-07-06 16:03:13.255  INFO 7496 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Servlet dispatcherServlet mapped to [/]

可以通過logging.pattern.dateformat單獨指定日誌裡面的日期輸出格式,可以通過logging.pattern.level單獨指定日誌中日誌級別輸出的格式。下面的程式碼中就分別指定了日期輸出格式和日誌級別的輸出格式。

logging.pattern.dateformat=HH:mm:ss.sss
logging.pattern.level=custom-%5p

按照上面自定義的日期格式和日誌級別輸出格式後,輸出的日誌會是類似於下面這樣的。

16:03:13.083  custom-INFO 7496 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2954 ms
16:03:13.255  custom-INFO 7496 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Servlet dispatcherServlet mapped to [/]

也可以通過#logging.pattern.console單獨指定控制檯的日誌輸出格式,通過#logging.pattern.file指定輸出到檔案的日誌格式。

#logging.pattern.console=console-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} -%msg%n
#logging.pattern.file=file-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} -%msg%n

指定日誌輸出檔案

預設的日誌資訊只會輸出到控制檯,可以在application.properties

檔案中通過logging.file指定日誌輸出檔名。當不指定路徑時,預設將在當前路徑下建立日誌檔案。

logging.file=logback.log

指定logging.file時也可以指定路徑,如下則指定了日誌內容將寫入到/logs目錄下的logback.log檔案。

logging.file=/logs/logback.log

當不指定logging.file時也可以通過logging.path指定日誌檔案輸出的路徑,這樣日誌內容將寫入到指定目錄下的spring.log檔案。如下配置則表示日誌內容將寫入到/logs/spring.log檔案中。

logging.path=/logs

日誌檔案壓縮

預設情況下每個日誌檔案寫入10MB內容後將重新產生一個新的日誌檔案,然後將老的進行壓縮,可以通過logging.file.max-size=20MB指定每個日誌檔案最多寫入20MB日誌。預設情況下壓縮的日誌檔案將不斷產生,沒有數量限制,可以通過logging.file.max-history指定需要保留的歷史日誌檔案數量。

調整日誌級別

日誌級別可以通過logging.level.logName=logLevel的形式進行調整,其中根日誌級別可以通過logging.level.root進行調整。比如下面的程式碼就配置了根日誌級別為WARN,而com.elim打頭的日誌級別為INFOorg.springframework打頭的日誌級別為DEBUG

logging.level.root=WARN
logging.level.com.elim=INFO
logging.level.org.springframework=DEBUG

自定義配置檔案

Spring Boot也允許我們通過定義logback.xmllogback-spring.xml檔案進行自定義的日誌輸出配置。Spring Boot建議我們定義日誌輸出檔案為logback-spring.xml,因為logback.xml是logback的預設日誌檔案,會被logback自動載入,直接使用它時有些東西可能Spring Boot還沒來得及初始化,並且使用logback.xml不能使用Spring Boot新增的一些擴充套件。之後就可以在配置檔案中按照logback的規範進行配置了,以下是一個簡單的配置,只配置了控制檯輸出。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

擴充套件使用springProfile

logback-spring.xml中可以使用Spring Boot擴充套件的<springProfile/>,它可以用在根元素<configuration/>元素下的任何位置,用來包裹任何元素。<springProfile/>用來定義在特定Profile被啟用時將使用的特殊配置資訊,比如下面的程式碼中就定義了當dev這個Profile被啟用時將定義org.springframework這個logger的輸出級別為DEBUG。

<springProfile name="dev">
    <logger name="org.springframework" level="DEBUG"/>
</springProfile>

擴充套件使用springProperty

logback-spring.xml中可以使用Spring Boot擴充套件的<springProperty/>,使用它可以把在application.properties中定義的屬性值對映為logback環境中的一個屬性,從而可以在logback的上下文使用。下面的配置中定義了屬性appName對應於Spring Boot的Environment中的app.name(由source屬性指定),當未指定時預設使用defaultValue屬性指定的TEST;屬性logPath對應於Spring Boot的Environment中的log.path,未指定時使用/logs/${appName}.log,其中的${appName}又對應於變數appName的值。定義好的變數可以在logback的配置檔案中以${varName}的形式進行引用。

<configuration>

    <springProperty name="appName" source="app.name" defaultValue="TEST"/>
    <springProperty name="logPath" source="log.path" defaultValue="/logs/${appName}.log"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${appName}-%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>5MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
    
</configuration>

(注:本文基於Spring Boot 2.0.3所寫)