1. 程式人生 > >Springboot(一)新增Logback日誌

Springboot(一)新增Logback日誌

1、背景介紹

在Springboot中使用自定義日誌模式,Logback日誌輸出方式相比於System.out.println()方式效率高,print()方式列印實在主執行緒中進行的,影響程式邏輯執行效率,而使用Logback方式從輸出效率上來講,不影響主執行緒的功能邏輯執行速度;從靈活性來說,可以自定義輸出模式,具有很大的靈活性和可操作性。下面來一步一步實現Springboot專案中引入該日誌輸入模式。

2、準備工作

  • **專案引入logback(通過maven倉庫來引用)
  • **src目錄下建立resources資料夾
  • **在resources資料夾下建立兩個檔案application.properties和logback.xml檔案
  • 再在application.properties和logback.xml中進行日誌輸出的格式方式的配置。
    紅色框都是需要準備的

3、詳細說明

關於application.properties檔案
在該檔案中進行配置,可以進行一些簡單的配置。
參考文章:Spring boot——logback 基礎使用篇(一)

定義日誌輸出的級別
根據不同的logging.level.*來確定不同的列印級別。

logging.level.root=INFO
logging.level.org.springframework.web=DEBUG
logging.level.org
.hibernate=ERROR

定義日誌輸出的檔案目錄

logging.path=E:\\demo
logging.file=demo.log
logging.level.root=info

這裡需要注意幾點:
1、這裡若不配置具體的包的日誌級別,日誌檔案資訊將為空
2、若只配置logging.path,那麼將會在F:\demo資料夾生成一個日誌檔案為spring.log(ps:該檔名是固定的,不能更改)。如果path路徑不存在,會自動建立該資料夾
3、若只配置logging.file,那將會在專案的當前路徑下生成一個demo.log日誌檔案。這裡可以使用絕對路徑如,會自動在e盤下建立資料夾和相應的日
4、 logging.file=e:\demo\demo.log


5、logging.path和logging.file同時配置,不會在這個路徑有F:\demo\demo.log日誌生成,logging.path和logging.file不會進行疊加(要注意)
6、 logging.path和logging.file的value都可以是相對路徑或者絕對路徑
所以只使用logging.file進行配置日誌的輸出位置即可。



<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
       說明:
       1、日誌級別及檔案
           日誌記錄採用分級記錄,級別與日誌檔名相對應,不同級別的日誌資訊記錄到不同的日誌檔案中
           例如:error級別記錄到log_error_xxx.log或log_error.log(該檔案為當前記錄的日誌檔案),而log_error_xxx.log為歸檔日誌,
           日誌檔案按日期記錄,同一天內,若日誌檔案大小等於或大於2M,則按0、1、2...順序分別命名
           例如log-level-2013-12-21.0.log
           其它級別的日誌也是如此。
       2、檔案路徑
           若開發、測試用,在Eclipse中執行專案,則到Eclipse的安裝路徑查詢logs資料夾,以相對路徑../logs。
           若部署到Tomcat下,則在Tomcat下的logs檔案中
       3、Appender
           FILEERROR對應error級別,檔名以log-error-xxx.log形式命名
           FILEWARN對應warn級別,檔名以log-warn-xxx.log形式命名
           FILEINFO對應info級別,檔名以log-info-xxx.log形式命名
           FILEDEBUG對應debug級別,檔名以log-debug-xxx.log形式命名
           stdout將日誌資訊輸出到控制上,為方便開發測試使用
    -->
    <contextName>SpringBootDemo</contextName>
    <property name="LOG_PATH" value="D:\\JavaWebLogs" />
    <!--設定系統日誌目錄-->
    <property name="APPDIR" value="SpringBootDemo" />

    <!-- 日誌記錄器,日期滾動記錄 -->
    <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌檔案的路徑及檔名 -->
        <file>${LOG_PATH}/${APPDIR}/log_error.log</file>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
            而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日誌記錄之外,還配置了日誌檔案不能超過2M,若超過2M,日誌檔案會以索引0開始,
            命名日誌檔案,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式記錄日誌 -->
        <append>true</append>
        <!-- 日誌檔案的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日誌檔案只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 日誌記錄器,日期滾動記錄 -->
    <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌檔案的路徑及檔名 -->
        <file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
            而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日誌記錄之外,還配置了日誌檔案不能超過2M,若超過2M,日誌檔案會以索引0開始,
            命名日誌檔案,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式記錄日誌 -->
        <append>true</append>
        <!-- 日誌檔案的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日誌檔案只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 日誌記錄器,日期滾動記錄 -->
    <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌檔案的路徑及檔名 -->
        <file>${LOG_PATH}/${APPDIR}/log_info.log</file>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
            而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日誌記錄之外,還配置了日誌檔案不能超過2M,若超過2M,日誌檔案會以索引0開始,
            命名日誌檔案,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式記錄日誌 -->
        <append>true</append>
        <!-- 日誌檔案的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日誌檔案只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--encoder 預設配置為PatternLayoutEncoder-->
        <encoder>
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--此日誌appender是為開發使用,只配置最底級別,控制檯輸出的日誌級別是大於或等於此級別的日誌資訊-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
    </appender>

    <logger name="org.springframework" level="WARN" />
    <logger name="org.hibernate" level="WARN" />

    <!-- 生產環境下,將此級別配置為適合的級別,以免日誌檔案太多或影響程式效能 -->
    <root level="INFO">
        <appender-ref ref="FILEERROR" />
        <appender-ref ref="FILEWARN" />
        <appender-ref ref="FILEINFO" />

        <!-- 生產環境將請stdout,testfile去掉 -->
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

4、總結

配置過程還是蠻簡單的,最後一步直接在類中新增如下程式碼即可:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class BlogAction{
     //定義一個全域性的記錄器,通過LoggerFactory獲取
     private final static Logger logger = LoggerFactory.getLogger(BlogAction.class); 
     /**
     * @param args
     */
    public static void main(String[] args) {
        logger.info("logback 成功了");
        logger.error("logback 成功了");
        logger.debug("logback 成功了");
    }
}

注意:
在application.properties檔案中新增
debug=true
才可以打印出debug的資訊。

以上是本人配置logback日誌的方式,歡迎交流。