SLF4J與Logback簡(jiǎn)介
Java日志框架眾多,常用的有java.util.logging, log4j, logback,commons-logging等。
SLF4J (Simple Logging Facade For Java),它是一個(gè)針對(duì)于各類Java日志框架的統(tǒng)一Facade抽象。SLF4J定義了統(tǒng)一的日志抽象接口,而真正的日志實(shí)現(xiàn)則是在運(yùn)行時(shí)決定。
LogBack是由log4j的創(chuàng)始人開發(fā)的新一代日志框架,用于替代log4j。它效率更高、能夠適應(yīng)諸多的運(yùn)行環(huán)境。LogBack的架構(gòu)設(shè)計(jì)足夠通用,可適用于不同的環(huán)境。目前LogBack分為三個(gè)模:lobback-core,logback-classic和logback-access。core模塊是其它兩個(gè)模塊的基礎(chǔ),classic是core的擴(kuò)展,是log4j巨大改進(jìn)的版本。
LogBack-classic本身實(shí)現(xiàn)了SL4J的API,因此可以很容易的在logback與其它日志系統(tǒng)之間轉(zhuǎn)換,例如log4j、JDK1.4中的java.util.logging(JUL)。
第三個(gè)模塊access,它集成了Servlet容器,提供了通過(guò)HTTP訪問(wèn)日志的功能,若了解access可訪問(wèn)文檔: http://logback.qos.ch/access.html。
LogBack的日志級(jí)別有trace、debug、info、warn、error,級(jí)別排序?yàn)椋?TRACE < DEBUG < INFO < WARN < ERROR。關(guān)于日志級(jí)別詳細(xì)信息,可參考官方文檔: http://logback.qos.ch/manual/architecture.html。
最簡(jiǎn)單的使用方式:配置logging.path
一般情況下,我們不需要單獨(dú)引入spring-boot-starter-logging,因?yàn)檫@是spring-boot-starter默認(rèn)引入的依賴。其依賴樹如下
從上面的依賴樹,我們可以看出,spring-boot-starter-logging依賴logback-classic, logback-classic依賴logback-core, sl4j-api。
Spring Boot為我們提供了功能齊全的默認(rèn)日志配置,基本上就是“開箱即用”。
默認(rèn)情況下,Spring Boot的日志是輸出到控制臺(tái)的,不寫入任何日志文件。
要讓Spring Boot輸出日志文件,最簡(jiǎn)單的方式是在application.properties配置文件中配置logging.path鍵值,如下:
logging.path=${user.home}/logs
這樣在${user.home}/logs目錄下會(huì)生成默認(rèn)的文件名命名的日志文件spring.log。
我們可以在application.properties配置文件中配置logging.file鍵值,如下:
spring.application.name=lightsword
logging.file=${user.home}/logs/${spring.application.name}.log
這樣日志文件的名字就是lightsword.log了。另外,二者不能同時(shí)使用,如同時(shí)使用,則只有l(wèi)ogging.file生效。
使用logback.xml配置日志
Spring Boot 提供了一套日志系統(tǒng),優(yōu)先選擇logback。日志服務(wù)一般都在ApplicationContext創(chuàng)建前就初始化了,所以日志配置,可以獨(dú)立于Spring的配置。我們也可以通過(guò)系統(tǒng)屬性和傳統(tǒng)的Spring Boot外部配置文件,實(shí)現(xiàn)日志控制和管理。
根據(jù)不同的日志系統(tǒng),SpringBoot按如下“約定規(guī)則”組織配置文件名加載日志配置文件:
日志框架 | 配置文件 |
---|---|
Logback | logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy |
Log4j | log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml |
Log4j2 | log4j2-spring.xml, log4j2.xml |
JDK (Java Util Logging) | logging.properties |
Spring Boot官方推薦優(yōu)先使用帶有-spring的文件名作為你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名為logback-spring.xml的日志配置文件,spring boot可以為它添加一些spring boot特有的配置項(xiàng)。
LogBack讀取配置或?qū)傩晕募牟襟E是:
LogBack在類路徑下嘗試查找logback.groovy的文件。如果logback.groovy沒(méi)有找到,就在類路徑下查找logback-test.xml文件。
若logback-test.xml文件沒(méi)有找到,就會(huì)在類路徑下查找logback.xml文件。我們也可以自定義logback.xml名稱,然后在application.properties中指定它。
#logging
logging.config=classpath:logback-dev.xml
要把這個(gè)logback-dev.xml配置文件放到類路徑下。
另外,如果我們沒(méi)有配置任何的logback.xml文件,LogBack就會(huì)使用BasicConfigurator啟動(dòng)默認(rèn)配置,該配置會(huì)將日志輸出到控制上。這樣就意味著使用缺省配置,它提供了默認(rèn)的最基礎(chǔ)的日志功能。
我們配置logback-dev.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--scan:當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true。-->
<!--scanPeriod:設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒(méi)有給出時(shí)間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。-->
<!--debug:當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_NAME" value="lightsword"/>
<contextName>${APP_NAME}</contextName>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<jmxConfigurator/>
<logger name="org.springframework.web" level="INFO"/>
<logger name="com.springboot.in.action" level="TRACE"/>
<logger name="org.apache.velocity.runtime.log" level="INFO"/>
<appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${user.home}/logs/${APP_NAME}</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rolling over -->
<FileNamePattern>${APP_NAME}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!-- keep 30 days' log history -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
</encoder>
</appender>
<!--TRACE, DEBUG, INFO, WARN, ERROR-->
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
<!--<appender-ref ref="FILE"/>-->
<appender-ref ref="dailyRollingFileAppender"/>
</root>
</configuration>
配置文件說(shuō)明
在logback.xml形式配置文件內(nèi),總體結(jié)構(gòu)是:最頂層是一個(gè)<configuration>標(biāo)簽,在<configuration>標(biāo)簽下可以有0到n個(gè)<appender>標(biāo)簽,0到n個(gè)<logger>標(biāo)簽,最多只能有1個(gè)<root>標(biāo)簽,以及其他一些高級(jí)配置。
下面我們針對(duì)上面的logback.xml配置文件作簡(jiǎn)要說(shuō)明。
1.<configuration scan="true" scanPeriod="60 seconds" debug="false">
根節(jié)點(diǎn)<configuration>包含的屬性:
scan:當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true。
scanPeriod:設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒(méi)有給出時(shí)間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。
debug:當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。
2.<jmxConfigurator/>
這個(gè)配置是開啟JMX的功能。JMX(Java Management Extensions,即Java管理擴(kuò)展)是一個(gè)為應(yīng)用程序、設(shè)備、系統(tǒng)等植入管理功能的框架。JMX可以跨越一系列異構(gòu)操作系統(tǒng)平臺(tái)、系統(tǒng)體系結(jié)構(gòu)和網(wǎng)絡(luò)傳輸協(xié)議,靈活的開發(fā)無(wú)縫集成的系統(tǒng)、網(wǎng)絡(luò)和服務(wù)管理應(yīng)用。
有了這個(gè)配置,我們可以直接在命令行輸入:
jconsole
關(guān)于jconsole的詳細(xì)介紹, 可以參考[11]。
這個(gè)命令會(huì)啟動(dòng)jconsole的GUI界面。如下圖
點(diǎn)擊到MBeans Tab,我們可以看到關(guān)于logback的信息:
3.<logger name="org.springframework.web" level="INFO"/>
我們定義了一個(gè) 捕獲 org.springframework.web 的日志,日志級(jí)別是 DEBUG。一個(gè)捕獲com.springboot.in.action的日志,日志級(jí)別是TRACE。
4.上面引用的org/springframework/boot/logging/logback/base.xml 文件是SpringBoot內(nèi)置的,內(nèi)容為:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->
<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>
其中,引用的defaults.xml,console-appender.xml,file-appender.xml都在同一個(gè)目錄下。默認(rèn)情況下包含兩個(gè)appender——一個(gè)是控制臺(tái),一個(gè)是文件,分別定義在console-appender.xml和file-appender.xml中。這里面的內(nèi)容就是SpringBoot默認(rèn)實(shí)現(xiàn)的logback的日志配置。
Spring Boot的日志模塊里,預(yù)定義了一些系統(tǒng)變量:
PID,當(dāng)前進(jìn)程ID
LOG_FILE,Spring Boot配置文件中l(wèi)ogging.file的值
LOG_PATH, Spring Boot配置文件中l(wèi)ogging.path的值
CONSOLE_LOG_PATTERN, Spring Boot配置文件中l(wèi)ogging.pattern.console的值
FILE_LOG_PATTERN, Spring Boot配置文件中l(wèi)ogging.pattern.file的值
對(duì)于應(yīng)用的日志級(jí)別也可以通過(guò)application.properties進(jìn)行定義:
logging.level.org.springframework.web=DEBUG
這樣相當(dāng)于我們?cè)趌ogback.xml 中配置的對(duì)應(yīng)的日志級(jí)別。名稱以logging.level開頭,后面跟要輸入日志的包名。
另外,如果在 logback.xml 和 application.properties 中定義了相同的配置(如都配置了 org.springframework.web)但是輸出級(jí)別不同,由于application.properties 的優(yōu)先級(jí)高于 logback.xml ,所以會(huì)使用application.properties的配置。
5.兩種常用的Appender
- ConsoleAppender
Logback使用appender來(lái)定義日志輸出,在開發(fā)過(guò)程中最常用的是將日志輸出到控制臺(tái)。我們直接使用SpringBoot內(nèi)置的ConsoleAppender配置。這個(gè)配置的內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Default logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->
<included>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<appender name="DEBUG_LEVEL_REMAPPER" class="org.springframework.boot.logging.logback.LevelRemappingAppender">
<destinationLogger>org.springframework.boot</destinationLogger>
</appender>
<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
<logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
<logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
<logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
<logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
<logger name="org.crsh.plugin" level="WARN"/>
<logger name="org.crsh.ssh" level="WARN"/>
<logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
<logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
<logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="WARN"/>
<logger name="org.springframework.boot.actuate.endpoint.jmx" additivity="false">
<appender-ref ref="DEBUG_LEVEL_REMAPPER"/>
</logger>
<logger name="org.thymeleaf" additivity="false">
<appender-ref ref="DEBUG_LEVEL_REMAPPER"/>
</logger>
</included>
<included>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
</included>
其中,
charset,表示對(duì)日志進(jìn)行編碼
pattern簡(jiǎn)單說(shuō)明:
%d{HH:mm:ss.SSS}——日志輸出時(shí)間
%thread——輸出日志的進(jìn)程名字,方括號(hào)括起來(lái)。這個(gè)信息在Web應(yīng)用以及異步任務(wù)處理中很有用。
%-5level——日志級(jí)別,并且使用5個(gè)字符靠左對(duì)齊
%logger{36}——日志輸出者的名字
%msg——日志消息
%n——平臺(tái)的換行符
在這種格式下一條日志的輸出內(nèi)容格式如下:
02:37:22.752 [http-nio-8888-exec-1] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Populated SecurityContextHolder with anonymous token: 'org.springframework.security.authentication.AnonymousAuthenticationToken@6fab4e5e: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@fffe3f86: RemoteIpAddress: 127.0.0.1; SessionId: E30F2AF513F94C7FC7611353B61A26C6; Granted Authorities: ROLE_ANONYMOUS'
- RollingFileAppender
另一種通用功能是將日志輸出到文件。同時(shí),隨著應(yīng)用的運(yùn)行時(shí)間越來(lái)越長(zhǎng),日志也會(huì)增長(zhǎng)的越來(lái)越多,將他們輸出到同一個(gè)文件并非一個(gè)好辦法。我們有RollingFileAppender用于切分文件日志。
<appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${user.home}/logs/${APP_NAME}</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rolling over -->
<FileNamePattern>${APP_NAME}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!-- keep 30 days' log history -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
</encoder>
</appender>
其中,核心的配置部分是是rollingPolicy的定義。上面的
<FileNamePattern>${APP_NAME}.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>30</maxHistory>
其中,
FileNamePattern,定義了日志的切分方式——把每一天的日志歸檔到一個(gè)文件中。
maxHistory,30表示只保留最近30天的日志,以防止日志填滿整個(gè)磁盤空間。我們也可以使用%d{yyyy-MM-dd_HH-mm}來(lái)定義精確到分的日志切分方式。
6.Threshold filter
ThresholdFilter是 logback定義的日志打印級(jí)別的過(guò)濾器。我們這里用ThresholdFilter來(lái)過(guò)濾掉ERROR級(jí)別以下的日志不輸出到文件中。
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
7.root節(jié)點(diǎn)
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
<!--<appender-ref ref="FILE"/>-->
<appender-ref ref="dailyRollingFileAppender"/>
</root>
root節(jié)點(diǎn)是必選節(jié)點(diǎn),用來(lái)指定最基礎(chǔ)的日志輸出級(jí)別,只有一個(gè)level屬性。
level:用來(lái)設(shè)置打印級(jí)別,大小寫無(wú)關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設(shè)置為INHERITED或者同義詞NULL。
默認(rèn)是DEBUG。
代碼中使用Logger打日志
直接給出代碼示例:
package com.springboot.in.action.filter
import javax.servlet._
import javax.servlet.annotation.WebFilter
import javax.servlet.http.HttpServletRequest
import com.alibaba.fastjson.JSON
import com.alibaba.fastjson.serializer.SerializerFeature
import org.slf4j.LoggerFactory
import org.springframework.core.annotation.Order
/**
* Created by jack on 2017/4/28.
*/
@Order(1) //@Order注解表示執(zhí)行過(guò)濾順序,值越小,越先執(zhí)行
@WebFilter(filterName = "loginFilter", urlPatterns = Array("/*")) //需要在spring-boot的入口處加注解@ServletComponentScan, 如果不指定,默認(rèn)url-pattern是/*
class LoginFilter extends Filter {
val log = LoggerFactory.getLogger(classOf[LoginFilter])
override def init(filterConfig: FilterConfig): Unit = {}
override def destroy(): Unit = {}
override def doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain): Unit = {
val session = request.asInstanceOf[HttpServletRequest].getSession
import org.springframework.security.core.context.SecurityContextHolder
import org.springframework.security.core.userdetails.UserDetails
val principal = SecurityContextHolder.getContext.getAuthentication.getPrincipal
println("LoginFilter:" + JSON.toJSONString(principal, SerializerFeature.PrettyFormat))
log.debug("LoginFilter:" + JSON.toJSONString(principal, SerializerFeature.PrettyFormat))
var username = ""
if (principal.isInstanceOf[UserDetails]) {
username = principal.asInstanceOf[UserDetails].getUsername
}
else {
username = principal.toString
}
session.setAttribute("username", username)
chain.doFilter(request, response)
}
}
其中,
val log = LoggerFactory.getLogger(classOf[LoginFilter])獲取Logger實(shí)例。
log.debug("LoginFilter:" + JSON.toJSONString(principal, SerializerFeature.PrettyFormat))
這一句就是打日志了。跟我們之前使用的方式一樣。
使用logback.groovy配置日志文件
領(lǐng)域特定語(yǔ)言(Domain-specific languages ,DSL)用途非常廣泛。logback.xml配置文件繁瑣而冗長(zhǎng)。Groovy是一門優(yōu)秀的DSL。logback框架支持logback.groovy簡(jiǎn)潔的DLS風(fēng)格的配置。詳細(xì)的配置語(yǔ)法介紹可以參考[5]。同時(shí),logback提供了直接把logback.xml轉(zhuǎn)換成logback.groovy的工具(測(cè)試過(guò),這個(gè)工具include標(biāo)簽暫時(shí)未作解析)[6]:https://logback.qos.ch/translator/asGroovy.html 。
我們添加logback-dev.groovy
//https://logback.qos.ch/translator/asGroovy.html
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.classic.filter.ThresholdFilter
import ch.qos.logback.core.ConsoleAppender
import ch.qos.logback.core.rolling.RollingFileAppender
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy
import java.nio.charset.Charset
import static ch.qos.logback.classic.Level.INFO
import static ch.qos.logback.classic.Level.TRACE
def USER_HOME = System.getProperty("user.home")
def APP_NAME = "lightsword"
def LOG_PATTERN = "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n"
def LOG_FILE = "${USER_HOME}/logs/${APP_NAME}"
def FILE_NAME_PATTERN = "${APP_NAME}.%d{yyyy-MM-dd}.log"
scan("60 seconds")
context.name = "${APP_NAME}"
jmxConfigurator()
logger("org.springframework.web", INFO)
logger("com.springboot.in.action", TRACE)
logger("org.apache.velocity.runtime.log", INFO)
appender("CONSOLE", ConsoleAppender) {
encoder(PatternLayoutEncoder) {
pattern = "${LOG_PATTERN}"
charset = Charset.forName("utf8")
}
}
appender("dailyRollingFileAppender", RollingFileAppender) {
file = "${LOG_FILE}"
rollingPolicy(TimeBasedRollingPolicy) {
fileNamePattern = "${FILE_NAME_PATTERN}"
maxHistory = 30
}
filter(ThresholdFilter) {
level = TRACE
}
encoder(PatternLayoutEncoder) {
pattern = "${LOG_PATTERN}"
}
}
root(TRACE, ["CONSOLE", "dailyRollingFileAppender"])
我們可以看出,使用groovy表達(dá)的配置,更加簡(jiǎn)潔、富表現(xiàn)力。
在application.properties里面配置logging.config
#logging
logging.config=classpath:logback-dev.groovy
另外,需要添加groovy依賴
<!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>${groovy.version}</version>
</dependency>
完成上述配置,即可使用跟logback.xml配置一樣的日志功能了。
使用Sentry統(tǒng)一跟蹤日志
關(guān)于日志的統(tǒng)一跟蹤管理,我們可以使用Sentry,它是一個(gè)統(tǒng)一的日志跟蹤平臺(tái)。在傳統(tǒng)的日志管理中,都是在服務(wù)器上通過(guò)tail, vim等工具查看日志,并且不同的日志位置也個(gè)不相同,而Sentry則是將這些日志(主要是錯(cuò)誤日志)通過(guò)統(tǒng)一的接口收集起來(lái),并且提供跟蹤、管理的功能,使得應(yīng)用程序的錯(cuò)誤、Bug能夠即時(shí)被解決。
Sentry提供了Java庫(kù)——Raven Java[7],Java應(yīng)用程序能夠在捕獲異常后將其發(fā)送到Sentry服務(wù)器中,另一方面它包含了各類日志框架的支持,支持集成Logback。具體的使用可參考[8][9]。
小結(jié)
本章工程源碼:
https://github.com/EasySpringBoot/lightsword/tree/spring_boot_logging_with_logback_2017.5.1
參考資料:
1.https://logback.qos.ch/manual/configuration.html
2.https://logback.qos.ch/access.html
3.https://logback.qos.ch/demo.html
4.http://logback.qos.ch/manual/architecture.html
5.https://logback.qos.ch/manual/groovy.html
6.https://logback.qos.ch/translator/asGroovy.html
7.https://github.com/getsentry/raven-java
8.https://github.com/getsentry/sentry
9.https://docs.sentry.io/
10.http://tengj.top/2017/04/05/springboot7/?utm_source=tuicool&utm_medium=referral
11.http://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html