Spring Boot Logback應用日志



2015-09-08 19:57 7673人閱讀 評論(0) 收藏 舉報
.
分類:
Spring Boot(51)
.

目錄(?)[+]

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

SLF4J與Logback簡介

SLF4J——Simple Logging Facade For Java,它是一個針對於各類Java日志框架的統一Facade抽象。Java日志框架眾多——常用的有java.util.logginglog4jlogbackcommons-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的日志,日志級別是DEBUGbase.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=DEBUGlogging.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級別的日志。

0
0
 
 

我的同類文章

Spring Boot(51)
更多文章


免責聲明!

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



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