55.SpringBoot日誌

鵬哥哥啊Aaaa發表於2020-12-21

目錄

一、SpringBoot日誌框架技術選型

二、SLF4j

三、日誌使用

四、日誌指定配置

1.原生的logback.xml

2.有profile的logback


一、SpringBoot日誌框架技術選型

SpringBoot的底層是Spring框架,Spring框架預設使用JCL。但是SpringBoot對Spring做了封裝,最終SpringBoot使用的是SLF4j(日誌抽象層)logback(日誌實現類)來完成日誌框架

 

二、SLF4j

我SpringBoot要用slf4j+logback來做日誌框架,但是我內部的一些元件他們用的是其他元件,比如Spring:commons+logging。Hibernate:jboss+logging等等。這邊就有一個需求:

統一記錄日誌:即使用的不是slf4j,但是我還是想要別的元件都以slf4j輸出日誌?

  1. 將系統中其他日誌框架先排除出去
  2. 用中間包來替換原有的日誌框架
  3. 匯入slf4j來實現日誌

注:引入其它框架的時候,一定要把這個框架依賴的日誌框架移除掉

 

三、日誌使用

1.預設配置

SpringBoot預設配置好了日誌:

#指定目錄下指定日誌級別
logging.level.com.xupeng=warn

#專案根目錄下生成對應的日誌
#logging.file.name=xupeng.log

#指定目錄下生成spring.log的日誌。如果logging.file.name存在,則logging.file.path不生效
logging.file.path=D:/aa/xupeng

#在控制檯輸出的日誌的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} -%msg%n
#在指定檔案中日誌輸出的格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n

輸出格式裡面內容的含義:

%d:日期時間

%thread:執行緒名

%-5level:級別,從左顯示5個字元寬度

%logger{50}:logger名字最長50個字元,否則按照句點分隔

%msg:日誌訊息

%n:換行

 

2.原始碼路徑:

 

四、日誌指定配置

給類路徑下放上每個日誌框架自己的配置檔案,springboot就不使用預設的配置了。

我們一般在正式開發,也會使用這種方法。

1.原生的logback.xml

在resources下面新建logback.xml。裡面的內容大家可以複製logback的程式碼,可以直接用。唯一需要修改的是兩個路徑。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method:%L - %msg%n</pattern>
        </layout>
    </appender>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder> <!--滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路徑-->
            <fileNamePattern>${user.dir}/logs/xupeng-info.%d.log</fileNamePattern>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method:%L - %msg%n</pattern>
        </layout>
    </appender>
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder> <!--滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路徑-->
            <fileNamePattern>${user.dir}/logs/xupeng-error.%d.log</fileNamePattern>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method:%L - %msg%n</pattern>
        </layout>
    </appender>

    <logger name="org.apache.ibatis" level="INFO" additivity="false" />
    <logger name="org.mybatis.spring" level="INFO" additivity="false" />
    <logger name="druid.sql.ResultSet" level="INFO" additivity="false" />
    <logger name="org.apache" level="INFO" additivity="false" />
    <logger name="com.netflix.discovery" level="INFO" additivity="false" />
    <logger name="org.redisson" level="INFO" additivity="false" />

    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>

2.有profile的logback

我們可能在不同環境會配置不同日誌檔案。比如開發環境和生產環境需要不同的日誌。

(1)這裡有幾個注意點,首先就是檔名。檔名logback後面需要字尾,不然會報錯。比如我這裡名字是logback-xupeng.xml

(2)設定環境,比如在application.properties裡面設定:

spring.profiles.active=prod

(3)新增如下程式碼

<springProfile name="dev">
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}---- %-5level [%thread] %logger{56}.%method:%L - %msg%n</pattern>
            </springProfile>
            <springProfile name="!dev">
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}==== %-5level [%thread] %logger{56}.%method:%L - %msg%n</pattern>
            </springProfile>

完整程式碼:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <springProfile name="dev">
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}---- %-5level [%thread] %logger{56}.%method:%L - %msg%n</pattern>
            </springProfile>
            <springProfile name="!dev">
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}==== %-5level [%thread] %logger{56}.%method:%L - %msg%n</pattern>
            </springProfile>
        </layout>
    </appender>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder> <!--滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路徑-->
            <fileNamePattern>${user.dir}/logs/xupeng-info.%d.log</fileNamePattern>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <springProfile name="dev">
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}---- %-5level [%thread] %logger{56}.%method:%L - %msg%n</pattern>
            </springProfile>
            <springProfile name="!dev">
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}==== %-5level [%thread] %logger{56}.%method:%L - %msg%n</pattern>
            </springProfile>
        </layout>
    </appender>
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder> <!--滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路徑-->
            <fileNamePattern>${user.dir}/logs/xupeng-error.%d.log</fileNamePattern>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method:%L - %msg%n</pattern>
        </layout>
    </appender>

    <logger name="org.apache.ibatis" level="INFO" additivity="false" />
    <logger name="org.mybatis.spring" level="INFO" additivity="false" />
    <logger name="druid.sql.ResultSet" level="INFO" additivity="false" />
    <logger name="org.apache" level="INFO" additivity="false" />
    <logger name="com.netflix.discovery" level="INFO" additivity="false" />
    <logger name="org.redisson" level="INFO" additivity="false" />

    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>

(4)結果