SpringBoot系列: logging


我們的 SpringBoot 程序都會加 spring-boot-starter 包, 而該包一個依賴項 spring-boot-starter-logging, 所以SpringBoot 程序不需要再顯式增加 spring-boot-starter-logging 包依賴.

使用 mvn dependency:tree 命令可以分析出應用程序的依賴樹, 從中可以看到 spring-boot-starter-logging 包也自動設置了
slf4j 和 logback 依賴, SpringBoot 使用了 slf4j 日志接口框架, 而 logback 是默認的日志實現框架, springBoot缺省的日志實現是logback, 也可以選用其他日志實現, 比如 log4j, log4j2等, 其中logback完全符合slf4j規范.

logback log4j 使用方式幾乎一樣, 功能更強大, 重要體現在:
1. 可以自動加載配置文件, 這個太好了, 不需要重啟系統就能實時調整日志設置.
2. 配置文件可以支持多個environment.

SpringBoot程序有一個默認的logback配置, 配置由一個關聯到root logger的ConsoleAppender組成, 默認的級別是Debug, 也就是該最小化配置是非常適合程序開發環境.

SpringBoot 使用 logback 作為日志引擎, 有下面三種方法:
1. 全部使用 application.property 配置日志輸出
這種做法最簡單了, 簡單幾個屬性設置就行了, 適合簡單的應用程序.
2. 使用 logback-spring.xml 配置
這種做法是最推薦的, 可以支持多環境, 可以支持實時修改日志設置. 當然也可以換個其他名字, 方法是在 application.properties文件中, 設置 logging.config 屬性.
3. 使用 logback.xml 配置
SpringBoot程序不太推薦logback.xml 配置, Spring Boot包含很多有用的Logback擴展, 這些擴展不能在標准的 logback.xml 配置文件中配置, 因為logback.xml加載的太早了.

 


===============================
application.property 配置方式
===============================

# springBoot缺省的日志實現是logback, 也可以選用其他日志實現, 比如 log4j, log4j2, 或 none, 其中none是徹底關閉日志. 
# org.springframework.boot.logging.LoggingSystem=Logback
# logging.config=classpath:logback-spring.xml

spring.application.name=<your app name here>

# 推薦使用logging.file屬性, 而不是 logging.path, 后者僅能指定日志文件的目錄, 其文件名永遠是spring.log
logging.file=${java.io.tmpdir}/${spring.application.name}.log

# debug=true
#當使用debug模式時, SpringBoot和Hibernate等核心組件會輸出更多的信息, debug模式下並不會確保我們應用程序能輸出DEBUG級別信息. 要想輸出com.springbootmybatis.mybatissample包的debug日志, 需要設置 logging.level.com.springbootmybatis.mybatissample=DEBUG

# trace=true  
# 不要打開 trace , 否則會輸出太多的trace日志信息, 日志文件可讀性非常差, 同時也會影響性能.  

#root logger的級別, 
logging.level.root=ERROR 
  
#其他 class 的級別
logging.level.org.springframework.web=ERROR
logging.level.org.hibernate=ERROR
logging.level.com.springbootmybatis.mybatissample=DEBUG

# 設置高亮error/info日志輸出
spring.output.ansi.enabled=ALWAYS
# NEVER: 禁用ANSI-colored輸出(默認項)
# DETECT:會檢查終端是否支持ANSI,是的話就采用彩色輸出(推薦項)
# ALWAYS:總是使用ANSI-colored格式輸出,若終端不支持的時候,會有很多干擾信息,不推薦使用


===============================
logback-spring.xml 配置方式
===============================
如果在application.properties 和 logback-spring.xml 都設置了日志配置, SpringBoot 會用logback-spring.xml覆蓋 application.properties 中的配置項.

application.properties 內容:

# org.springframework.boot.logging.LoggingSystem=Logback 
# logging.config=classpath:logback-spring.xml
spring.profiles.active:prod

 

logback-spring.xml 內容:

注意 configuration tag 的三個重要屬性:
scan: 當此屬性設置為 true 時,配置文件如果發生改變,將會被重新加載,默認值為 true.
scanPeriod: 設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒.當 scan 為 true 時,此屬性生效.默認的時間間隔為 1 分鍾.
debug: 當此屬性設置為 true 時,將console上打印出 logback 內部日志信息,實時查看 logback 運行狀態, 但這些logback內部日志不會記錄到log文件中. 默認值為 false. 

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="60 seconds" debug="false">
   <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
   <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>

    <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
    <property name="PROD_LOG_HOME" value="C:\\Users\\Administrator\\logs"  />
    <property name="DEV_LOG_HOME" value="C:\\Users\\Administrator\\logs"  />
    <property name="APP_NAME" value="MyBatisSample"  />

    <!-- 測試環境+開發環境. 多個使用逗號隔開. -->
    <springProfile name="test,dev">

        <appender name="ROLLING-FILE"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--日志文件輸出的文件名-->
                <FileNamePattern>${DEV_LOG_HOME}/${APP_NAME}.%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:%line - %msg%n</pattern>
             </encoder>
        </appender>

        <!-- 日志輸出級別 -->
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="ROLLING-FILE"/>
        </root>

        <!-- 自定義Class設置為DEBUG級別, 可以輸出MyBatis的SQL和參數 -->
        <logger name="com.springbootmybatis.mybatissample" level="DEBUG" />

        <!-- show parameters for hibernate sql 專為 Hibernate 定制 -->
        <logger name="org.hibernate.type.descriptor.sql.BasicBinder"  level="DEBUG" />
        <logger name="org.hibernate.type.descriptor.sql.BasicExtractor"  level="DEBUG" />
        <logger name="org.hibernate.SQL" level="DEBUG" />
        <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
        <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />

        <!--myibatis log configure-->
        <logger name="java.sql.Connection" level="DEBUG"/>
        <logger name="java.sql.Statement" level="DEBUG"/>
        <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    </springProfile>

    <!-- 生產環境. -->
    <springProfile name="prod">
        <appender name="ROLLING-FILE"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--日志文件輸出的文件名-->
                <FileNamePattern>${PROD_LOG_HOME}/${APP_NAME}.%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:%line - %msg%n</pattern>
             </encoder>
        </appender>

        <!-- 日志輸出級別 -->
        <root level="ERROR">
            <appender-ref ref="ROLLING-FILE"/>
        </root>

        <!-- 自定義Class設置為INFO級別, 可以禁止MyBatis的SQL和參數  -->
        <logger name="com.springbootmybatis.mybatissample" level="INFO" />

        <!-- show parameters for hibernate sql 專為 Hibernate 定制 -->
        <!--
        <logger name="org.hibernate.type.descriptor.sql.BasicBinder"  level="DEBUG" />
        <logger name="org.hibernate.type.descriptor.sql.BasicExtractor"  level="DEBUG" />
        <logger name="org.hibernate.SQL" level="DEBUG" />
        <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
        <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
        -->

        <!--myibatis log configure-->
        <!--
        <logger name="com.apache.ibatis" level="DEBUG"/>
        <logger name="java.sql.Connection" level="DEBUG"/>
        <logger name="java.sql.Statement" level="DEBUG"/>
        <logger name="java.sql.PreparedStatement" level="DEBUG"/>
        -->
    </springProfile>
</configuration>

 

===============================
Java 代碼中的logger使用
===============================
root logger 是一個所有class logger 的根, 通常我們不需要用代碼獲取root logger, 直接在logback 配置文件中設置它的logging 輸出配置即可, 下面是獲取 root logger 和普通class的logger的代碼, 注意代碼中僅引入了slf4j的類, 而不會引入任何logback的類.

# MyApp.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
Logger myAppLogger = LoggerFactory.getLogger(MyApp.class)

 

===============================
參考
===============================
http://tengj.top/2017/04/05/springboot7/
http://www.hifreud.com/2017/06/27/spring-boot-07-log/
https://www.mkyong.com/spring-boot/spring-boot-slf4j-logging-example/
https://www.cnblogs.com/lixuwu/p/5804793.html
https://howtoprogram.xyz/2016/12/23/how-to-configure-logging-in-spring-boot/
http://www.cnblogs.com/lixuwu/p/6323739.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM