Spring Boot Logback幾種日志詳解


日志對於應用程序來說是非常重要的,Spring框架本身集成了不少其他工具,我們自身的應用也會使用到第三方庫,所以我們推薦在Spring應用中使用SLF4J/Logback來記錄日志。

SLF4J與Logback簡介

SLF4J——Simple Logging Facade For Java,它是一個針對於各類Java日志框架的統一Facade抽象。Java日志框架眾多——常用的有java.util.logginglog4jlogback

commons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定義了統一的日志抽象接口,而真正的日志實現則是在運行時決定的——它提供了各類日志框架的binding。

Logback是log4j框架的作者開發的新一代日志框架,它效率更高、能夠適應諸多的運行環境,同時天然支持SLF4J。

Spring Boot Logging

Spring Boot實現了一套日志系統——它能夠根據類路徑上的內容來決定使用哪一種日志框架,logback是最優先的選擇。

配置了logback.xml可以利用Spring Boot提供的默認日志配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <logger name="org.springframework.web" level="DEBUG"/>
</configuration>

這樣就定義了一個<logger>捕獲org.springframework.web的日志,日志級別是DEBUG ,其中base.xml內容如下:

<included>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</included>

Spring Boot的日志系統預先定義了一些系統變量:

  • ${PID},當前進程ID
  • ${LOG_FILE},Spring Boot配置文件中logging.file的值
  • ${LOG_PATH}, Spring Boot配置文件中logging.path的值

同時默認情況下包含另個appender——一個是控制台,一個是文件,分別定義在console-appender.xmlfile-appender.xml中。

同時對於應用的日志級別也可以通過application.properties進行定義:

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

這等價於在logback.xml配置appender的日志級別

ConsoleAppender

Logback使用appender來定義日志輸出,在開發過程中最常用的是將日志輸出到控制台:

<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
    <Pattern>.%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %n</Pattern>
  </encoder>
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>TRACE</level>
  </filter>
</appender>

<encoder>表示對日志進行編碼:

  • %d{HH:mm:ss.SSS}——日志輸出時間
  • %thread——輸出日志的進程名字,這在Web應用以及異步任務處理中很有用
  • %-5level——日志級別,並且使用5個字符靠左對齊
  • %logger{36}——日志輸出者的名字
  • %msg——日志消息
  • %n——平台的換行符

在這種格式下一條日志的輸出結果如下:

0:12:51.012 [qtp231719230-45] DEBUG o.c.d.r.util.LoggingResponseFilter

RollingFileAppender

另一種常見的日志輸出到文件,隨着應用的運行時間越來越長,日志也會增長的越來越多,將他們輸出到同一個文件並非一個好辦法。RollingFileAppender用於切分文件日志:

<appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <File>/data/log/app.log</File>
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!-- daily rollover -->
    <FileNamePattern>rest-demo.%d{yyyy-MM-dd}.log</FileNamePattern>
    <!-- keep 30 days' worth of history -->
    <maxHistory>30</maxHistory>         
  </rollingPolicy>
  <encoder>
    <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
  </encoder>        
</appender>

其中重要的是rollingPolicy的定義,上例中<FileNamePattern>rest-demo.%d{yyyy-MM-dd}.log</FileNamePattern>定義了日志的切分方式——把每一天的日志歸檔到一個文件中,

<maxHistory>30</maxHistory>表示只保留最近30天的日志,以防止日志填滿整個磁盤空間。

同理,可以使用%d{yyyy-MM-dd_HH-mm}來定義精確到分的日志切分方式。

Sentry

Sentry是一個統一的日志跟蹤平台,在傳統的日志管理中,都是在服務器上通過tailvim等工具查看日志,並且不同的日志位置也個不相同,而Sentry則是將這些日志(主要是錯誤日志)

通過統一的接口收集起來,並且提供跟蹤、管理的功能,使得應用程序的錯誤、Bug能夠即時被解決。

Sentry提供了Java庫——Raven Java,Java應用程序能夠在捕獲異常后將其發送到Sentry服務器中,另一方面它包含了各類日志框架的支持,以Logbakc為例:

<dependency>
    <groupId>net.kencochrane.raven</groupId>
    <artifactId>raven-logback</artifactId>
    <version>6.0.0</version>
</dependency>

logback.xml中定義appender

<configuration>
    <appender name="Sentry" class="net.kencochrane.raven.logback.SentryAppender">
        <dsn>https://publicKey:secretKey@host:port/1?options</dsn>
        <tags>tag1:value1,tag2:value2</tags>
        <!-- Optional, allows to select the ravenFactory -->
        <!--<ravenFactory>net.kencochrane.raven.DefaultRavenFactory</ravenFactory>-->
    </appender>
    <root level="warn">
        <appender-ref ref="Sentry"/>
    </root>
</configuration>

我們推薦在這個<appender>中加入<filter>用於過濾ERROR級別的日志。

轉載:http://blog.csdn.net/xiaoyu411502/article/details/48295973


免責聲明!

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



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