spring boot 日誌介紹 以及 logback配置示例

劍握在手發表於2017-11-13

以下是springboot的一個區域性依賴關係:

 

 可以看到,java util logging(jul)、common-logging(jcl)、log4j,都被橋接到了slf4j-api上,slf4j-api只提供了slf4j的介面,並無實現,圖中的logback-classic則直接對slf4j進行了實現,而logback-core則支撐了logback-classic

我們可以得出springboot預設日誌的最終實現者是logback,即你使用了spring-boot-starter則會引入該日誌框架,同時你還可以使用common-logging,log4j,slf4j,java util logging的寫法。

 

依賴關係分析結束,我們直接上logback的配置檔案——logback.xml:

 

配置示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--
    Copyright 2010-2011 The myBatis Team
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
        http://www.apache.org/licenses/LICENSE-2.0
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
<configuration debug="false">
    <!--定義日誌檔案的儲存地址 勿在 LogBack 的配置中使用相對路徑-->
    <property name="LOG_HOME" value="/home" />
    <!-- 控制檯輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %green(%-5level) %blue(%property{PID}) --- [%-20thread] %cyan(%-70logger{50}) : %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日誌檔案 -->
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日誌檔案輸出的檔名-->
            <FileNamePattern>${LOG_HOME}/eureka-server.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日誌檔案保留天數-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日誌檔案最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <appender name="liuyx"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日誌檔案輸出的檔名-->
            <FileNamePattern>${LOG_HOME}/liuyx.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日誌檔案保留天數-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日誌檔案最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!--
    配置一個更自由的log,
    可以直接在java中使用
  log4j寫法:
  Logger logger = LogManager.getLogger("liuyxlogger");
   或者slf4j的寫法
  Logger logger = LoggerFactory.getLogger("liuyxlogger");
  來將日誌列印到指定的檔案
  -->
    <logger name="liuyxlogger" additivity="TRUE" level="INFO">
        <appender-ref ref="liuyx" level="INFO" />
    </logger>

    <!--myibatis log configure 名稱空間寫法-->
    <logger name="org.apache.ibatis" level="DEBUG"/>

    <!-- 日誌輸出級別 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
    <!--日誌非同步到資料庫 -->
    <!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
            <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <driverClass>com.mysql.jdbc.Driver</driverClass>
                <url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
                <user>root</user>
                <password>root</password>
            </dataSource>
        </connectionSource>
    </appender>-->
</configuration>

 

註釋很明白了,把它放在maven專案的resources目錄下即可生效。

 

2018年7月10日追加:

 

spring-boot中對logback做了一些加工,如果我們使用檔名logback-spring.xml,這些加工便會生效,比如,從配置檔案中讀取一個引數,以下是一個示例配置:

<?xml version="1.0" encoding="UTF-8"?>
<!--
    spring對logback提供了一些擴充套件,如果想使用這些擴充套件,請使用本檔案的檔名替代logback.xml,詳見
    https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/htmlsingle/#boot-features-logging
-->
<configuration debug="false">

    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <springProperty scope="context" name="springAppName" source="spring.application.name"/>

    <!--定義日誌檔案的儲存地址 勿在 LogBack 的配置中使用相對路徑-->
    <property name="LOG_HOME" value="/log/${springAppName}" />
    <!-- 控制檯輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %green(%-5level) %blue(%property{PID}) --- [%-20thread] %cyan(%-70logger{50}) : %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日誌檔案 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--<file>${LOG_HOME}/%d{yyyy-MM-dd}/log.log</file>-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日誌檔案輸出的檔名-->
            <fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--日誌檔案保留天數-->
            <maxHistory>30</maxHistory>
            <maxFileSize>30MB</maxFileSize>
            <!--所有日誌最大尺寸-->
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level - %msg%n</pattern>
        </encoder>
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
           <!-- 過濾掉TRACE和DEBUG級別的日誌 -->
           <level>INFO</level>
        </filter>
    </appender>
    <!-- 非同步輸出 -->
    <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
        <!-- 不丟失日誌.預設的,如果佇列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌 -->
        <!--<discardingThreshold >0</discardingThreshold>-->
        <!-- 更改預設的佇列的深度,該值會影響效能.預設值為256 -->
        <queueSize>512</queueSize>
        <!-- 新增附加的appender,最多隻能新增一個 -->
        <appender-ref ref ="FILE"/>
    </appender>
    <!--<logger name="org.springframework.amqp" level="INFO"/>
    <logger name="org.springframework.boot" level="INFO"/>-->
    <!--<logger name="com.inspur" level="INFO"/>-->
    <!-- 日誌輸出級別 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="ASYNC" />
    </root>
</configuration>

 

相關文章