日志對於應用程序來說是非常重要的,Spring框架本身集成了不少其他工具,我們自身的應用也會使用到第三方庫,所以我們推薦在Spring應用中使用SLF4J/Logback來記錄日志。
SLF4J與Logback簡介
SLF4J——Simple Logging Facade For Java,它是一個針對於各類Java日志框架的統一Facade抽象。Java日志框架眾多——常用的有java.util.logging
, log4j
, logback
,
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.xml
和file-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是一個統一的日志跟蹤平台,在傳統的日志管理中,都是在服務器上通過tail
, vim
等工具查看日志,並且不同的日志位置也個不相同,而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