Springboot整合默認自帶Logback日志

Springboot默認日志框架是Logback,是由log4j創始人設計的另一個開源日志組件,內核進行了重寫,性能提高了,初始化內存更小了。

查看springboot官方文檔Application Properties,文檔這么說的
Location of the logging configuration file. For instance, classpath:logback.xml for Logback.
這句話告訴我們,可以在資源目錄創建logback.xml自定義配置日志管理規則。

創建日志配置文件

resources/logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
configuration作為logback的根節點有以下屬性
    scan: 默認為true, 配置文件發生變化, 將會被重新加載
    scanPeriod: 檢測配置文件是否有修改的間隔時間,默認1分鐘
    debug: 默認為false, true時會打印logback內部日志信息
    packagingData: 默認為false, true時, logback可以包含它輸出的堆棧跟蹤行的每一行的打包數據。打包數據由jar文件的名稱和版本組成,而這個jar文件是由堆棧跟蹤線的類產生的
-->
<configuration debug="false">
   
    <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
    <property name="LOG_HOME" value="D://logs" />

    <!--
        appender: 有日志時, logback會將這個事件發送給appender
            filter;過濾器
            encoder:日志格式
            append:如果目標文件已存在, 是否追加到文件尾部, 默認為true, 否則清空文件
            rollingPolicy:如何滾動, 我們這是使用了TimeBasedRollingPolicy, 基于時間進行滾動
            triggeringPolicy: 何時滾動
    -->
    <!--
        rollingPolicy
            TimeBasedRollingPolicy: 基于時間進行滾動
                fileNamePattern: 文件路徑
                maxHistory: 保留多長時間的日志
                totalSizeGap: 限制了日志文件的大小總共不能超過的大小
                cleanHistoryOnStart: 指定了是否重啟應用的時候刪除之前的歸檔日志
            SizeAndTimeBasedRollingPolicy: 策略除了具有 TimeBasedRollingPolicy 的功能外,還能限制單個日志文件的大小,當單個日志到達指定的大小時,觸發日志滾動

    -->    

    <!--控制臺 -->
    <appender name="CONSOLE" 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} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--只記錄INFO級別的日志-->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--追加-->
        <append>true</append>

        <!--過濾器,只記錄INFO級別的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件輸出的文件名-->
            <fileNamePattern>${LOG_HOME}/test.%d{yyyy-MM-dd}-info.log</fileNamePattern>
            <!--日志文件保留天數-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

     <!--只記錄WARN級別的日志-->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--追加-->
        <append>true</append>

        <!--過濾器,只記錄WARN級別的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件輸出的文件名-->
            <fileNamePattern>${LOG_HOME}/test.%d{yyyy-MM-dd}-warn.log</fileNamePattern>
            <!--日志文件保留天數-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!--過濾器,只記錄ERROR級別的日志-->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--追加-->
        <append>true</append>

        <!--過濾器,只記錄ERROR級別的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件輸出的文件名-->
            <fileNamePattern>${LOG_HOME}/test.%d{yyyy-MM-dd}-error.log</fileNamePattern>
            <!--日志文件保留天數-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>


    <!-- 日志輸出級別,INFO及以上的都會被輸出 -->
    <root level="INFO">
        <!--輸出到控制臺,生產環境這個可以注釋掉-->
        <appender-ref ref="CONSOLE"/>
        <!--保存到日志文件,測試這個可以注釋掉-->
        <appender-ref ref="INFO" />
        <appender-ref ref="WARN" />
        <appender-ref ref="ERROR" />
    </root>

</configuration>

測試

運行程序,發現在我們指定的的目錄下創建日志文件


日志文件

寫個接口,打印下日志

@RestController
public class HelloController {

    Logger logger = LoggerFactory.getLogger(HelloController.class);

    @GetMapping("/hello")
    public String hello(){
        logger.debug("debug...");
        logger.info("info...");
        logger.warn("warn...");
        logger.error("error...");
        return "hello";
    }

}

每次都要寫Logger logger = LoggerFactory.getLogger(HelloController.class); 不開心,那能不能少些點呢?
我們可以借助lombok給我們提供的@Slf4j注解改善這個問題。

引入lombok依賴

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

修改控制器類
在控制器添加@Slf4j注解,這時就等價于寫了Logger logger = LoggerFactory.getLogger(HelloController.class);

@RestController
//添加Slf4j注解
@Slf4j
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        log.debug("debug...");
        log.info("info...");
        log.warn("warn...");
        log.error("error...");
        return "hello";
    }

}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容