《Spring Boot極簡教程》第17章 Spring Boot集成日志

SLF4J與Logback簡介

Java日志框架眾多屋灌,常用的有java.util.logging, log4j, logback洁段,commons-logging等。

SLF4J (Simple Logging Facade For Java)共郭,它是一個針對于各類Java日志框架的統(tǒng)一Facade抽象祠丝。SLF4J定義了統(tǒng)一的日志抽象接口,而真正的日志實現(xiàn)則是在運行時決定除嘹。

LogBack是由log4j的創(chuàng)始人開發(fā)的新一代日志框架写半,用于替代log4j。它效率更高尉咕、能夠適應(yīng)諸多的運行環(huán)境叠蝇。LogBack的架構(gòu)設(shè)計足夠通用,可適用于不同的環(huán)境年缎。目前LogBack分為三個模:lobback-core悔捶,logback-classic和logback-access铃慷。core模塊是其它兩個模塊的基礎(chǔ),classic是core的擴展蜕该,是log4j巨大改進(jìn)的版本犁柜。

LogBack-classic本身實現(xiàn)了SL4J的API,因此可以很容易的在logback與其它日志系統(tǒng)之間轉(zhuǎn)換堂淡,例如log4j馋缅、JDK1.4中的java.util.logging(JUL)。

第三個模塊access淤齐,它集成了Servlet容器股囊,提供了通過HTTP訪問日志的功能,若了解access可訪問文檔: http://logback.qos.ch/access.html更啄。

LogBack的日志級別有trace稚疹、debug、info祭务、warn内狗、error,級別排序為: TRACE < DEBUG < INFO < WARN < ERROR义锥。關(guān)于日志級別詳細(xì)信息柳沙,可參考官方文檔: http://logback.qos.ch/manual/architecture.html

最簡單的使用方式:配置logging.path

一般情況下拌倍,我們不需要單獨引入spring-boot-starter-logging赂鲤,因為這是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的日志是輸出到控制臺的寺谤,不寫入任何日志文件仑鸥。

要讓Spring Boot輸出日志文件,最簡單的方式是在application.properties配置文件中配置logging.path鍵值变屁,如下:

logging.path=${user.home}/logs

這樣在${user.home}/logs目錄下會生成默認(rèn)的文件名命名的日志文件spring.log眼俊。

我們可以在application.properties配置文件中配置logging.file鍵值,如下:

spring.application.name=lightsword
logging.file=${user.home}/logs/${spring.application.name}.log

這樣日志文件的名字就是lightsword.log了粟关。另外泵琳,二者不能同時使用,如同時使用,則只有l(wèi)ogging.file生效获列。

使用logback.xml配置日志

Spring Boot 提供了一套日志系統(tǒng)谷市,優(yōu)先選擇logback。日志服務(wù)一般都在ApplicationContext創(chuàng)建前就初始化了击孩,所以日志配置迫悠,可以獨立于Spring的配置。我們也可以通過系統(tǒng)屬性和傳統(tǒng)的Spring Boot外部配置文件巩梢,實現(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特有的配置項忌警。

LogBack讀取配置或?qū)傩晕募牟襟E是:

LogBack在類路徑下嘗試查找logback.groovy的文件搁拙。如果logback.groovy沒有找到,就在類路徑下查找logback-test.xml文件法绵。

若logback-test.xml文件沒有找到箕速,就會在類路徑下查找logback.xml文件。我們也可以自定義logback.xml名稱朋譬,然后在application.properties中指定它盐茎。

#logging
logging.config=classpath:logback-dev.xml

要把這個logback-dev.xml配置文件放到類路徑下。

另外徙赢,如果我們沒有配置任何的logback.xml文件字柠,LogBack就會使用BasicConfigurator啟動默認(rèn)配置,該配置會將日志輸出到控制上狡赐。這樣就意味著使用缺省配置募谎,它提供了默認(rèn)的最基礎(chǔ)的日志功能。

我們配置logback-dev.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--scan:當(dāng)此屬性設(shè)置為true時阴汇,配置文件如果發(fā)生改變,將會被重新加載节槐,默認(rèn)值為true搀庶。-->
<!--scanPeriod:設(shè)置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位铜异,默認(rèn)單位是毫秒哥倔。當(dāng)scan為true時,此屬性生效揍庄。默認(rèn)的時間間隔為1分鐘咆蒿。-->
<!--debug:當(dāng)此屬性設(shè)置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(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>



配置文件說明

在logback.xml形式配置文件內(nèi),總體結(jié)構(gòu)是:最頂層是一個<configuration>標(biāo)簽蒂破,在<configuration>標(biāo)簽下可以有0到n個<appender>標(biāo)簽馏谨,0到n個<logger>標(biāo)簽,最多只能有1個<root>標(biāo)簽附迷,以及其他一些高級配置惧互。

下面我們針對上面的logback.xml配置文件作簡要說明。

1.<configuration scan="true" scanPeriod="60 seconds" debug="false">
根節(jié)點<configuration>包含的屬性:

  • scan:當(dāng)此屬性設(shè)置為true時喇伯,配置文件如果發(fā)生改變喊儡,將會被重新加載,默認(rèn)值為true稻据。

  • scanPeriod:設(shè)置監(jiān)測配置文件是否有修改的時間間隔艾猜,如果沒有給出時間單位,默認(rèn)單位是毫秒攀甚。當(dāng)scan為true時箩朴,此屬性生效。默認(rèn)的時間間隔為1分鐘秋度。

  • debug:當(dāng)此屬性設(shè)置為true時炸庞,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)荚斯。默認(rèn)值為false埠居。

2.<jmxConfigurator/>

這個配置是開啟JMX的功能。JMX(Java Management Extensions事期,即Java管理擴展)是一個為應(yīng)用程序滥壕、設(shè)備、系統(tǒng)等植入管理功能的框架兽泣。JMX可以跨越一系列異構(gòu)操作系統(tǒng)平臺绎橘、系統(tǒng)體系結(jié)構(gòu)和網(wǎng)絡(luò)傳輸協(xié)議,靈活的開發(fā)無縫集成的系統(tǒng)唠倦、網(wǎng)絡(luò)和服務(wù)管理應(yīng)用称鳞。

有了這個配置鸥诽,我們可以直接在命令行輸入:

jconsole

關(guān)于jconsole的詳細(xì)介紹, 可以參考[11]覆旭。

這個命令會啟動jconsole的GUI界面绳锅。如下圖

點擊到MBeans Tab馁菜,我們可以看到關(guān)于logback的信息:

3.<logger name="org.springframework.web" level="INFO"/>
我們定義了一個 捕獲 org.springframework.web 的日志沈矿,日志級別是 DEBUG茶没。一個捕獲com.springboot.in.action的日志秒咨,日志級別是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都在同一個目錄下诗眨。默認(rèn)情況下包含兩個appender——一個是控制臺唉匾,一個是文件,分別定義在console-appender.xml和file-appender.xml中匠楚。這里面的內(nèi)容就是SpringBoot默認(rèn)實現(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的值

對于應(yīng)用的日志級別也可以通過application.properties進(jìn)行定義:

logging.level.org.springframework.web=DEBUG

這樣相當(dāng)于我們在logback.xml 中配置的對應(yīng)的日志級別。名稱以logging.level開頭,后面跟要輸入日志的包名咒循。

另外,如果在 logback.xml 和 application.properties 中定義了相同的配置(如都配置了 org.springframework.web)但是輸出級別不同蚂四,由于application.properties 的優(yōu)先級高于 logback.xml 久妆,所以會使用application.properties的配置抑诸。

5.兩種常用的Appender

  • ConsoleAppender

Logback使用appender來定義日志輸出,在開發(fā)過程中最常用的是將日志輸出到控制臺。我們直接使用SpringBoot內(nèi)置的ConsoleAppender配置。這個配置的內(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,表示對日志進(jìn)行編碼

pattern簡單說明:

%d{HH:mm:ss.SSS}——日志輸出時間

%thread——輸出日志的進(jìn)程名字笨蚁,方括號括起來戚啥。這個信息在Web應(yīng)用以及異步任務(wù)處理中很有用呆盖。

%-5level——日志級別乏苦,并且使用5個字符靠左對齊

%logger{36}——日志輸出者的名字

%msg——日志消息

%n——平臺的換行符

在這種格式下一條日志的輸出內(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

另一種通用功能是將日志輸出到文件。同時,隨著應(yīng)用的運行時間越來越長,日志也會增長的越來越多,將他們輸出到同一個文件并非一個好辦法。我們有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聪全,定義了日志的切分方式——把每一天的日志歸檔到一個文件中泊藕。

maxHistory,30表示只保留最近30天的日志难礼,以防止日志填滿整個磁盤空間娃圆。我們也可以使用%d{yyyy-MM-dd_HH-mm}來定義精確到分的日志切分方式汽久。

6.Threshold filter

ThresholdFilter是 logback定義的日志打印級別的過濾器。我們這里用ThresholdFilter來過濾掉ERROR級別以下的日志不輸出到文件中踊餐。

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>

7.root節(jié)點

    <root level="DEBUG">
        <appender-ref ref="CONSOLE"/>
        <!--<appender-ref ref="FILE"/>-->
        <appender-ref ref="dailyRollingFileAppender"/>
    </root>

root節(jié)點是必選節(jié)點,用來指定最基礎(chǔ)的日志輸出級別臀稚,只有一個level屬性吝岭。

level:用來設(shè)置打印級別,大小寫無關(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í)行過濾順序稚机,值越小幕帆,越先執(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實例失乾。

 log.debug("LoginFilter:" + JSON.toJSONString(principal, SerializerFeature.PrettyFormat))

這一句就是打日志了。跟我們之前使用的方式一樣纬乍。

使用logback.groovy配置日志文件

領(lǐng)域特定語言(Domain-specific languages 碱茁,DSL)用途非常廣泛。logback.xml配置文件繁瑣而冗長仿贬。Groovy是一門優(yōu)秀的DSL纽竣。logback框架支持logback.groovy簡潔的DLS風(fēng)格的配置。詳細(xì)的配置語法介紹可以參考[5]茧泪。同時蜓氨,logback提供了直接把logback.xml轉(zhuǎn)換成logback.groovy的工具(測試過,這個工具include標(biāo)簽暫時未作解析)[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á)的配置,更加簡潔缰泡、富表現(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宜猜,它是一個統(tǒng)一的日志跟蹤平臺泼返。在傳統(tǒng)的日志管理中,都是在服務(wù)器上通過tail, vim等工具查看日志姨拥,并且不同的日志位置也個不相同绅喉,而Sentry則是將這些日志(主要是錯誤日志)通過統(tǒng)一的接口收集起來渠鸽,并且提供跟蹤、管理的功能柴罐,使得應(yīng)用程序的錯誤徽缚、Bug能夠即時被解決。

Sentry提供了Java庫——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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市党瓮,隨后出現(xiàn)的幾起案子详炬,更是在濱河造成了極大的恐慌,老刑警劉巖寞奸,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呛谜,死亡現(xiàn)場離奇詭異,居然都是意外死亡枪萄,警方通過查閱死者的電腦和手機呻率,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呻引,“玉大人礼仗,你說我怎么就攤上這事÷哂疲” “怎么了元践?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長童谒。 經(jīng)常有香客問我单旁,道長,這世上最難降的妖魔是什么饥伊? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任象浑,我火速辦了婚禮,結(jié)果婚禮上琅豆,老公的妹妹穿的比我還像新娘愉豺。我一直安慰自己,他們只是感情好茫因,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布蚪拦。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驰贷。 梳的紋絲不亂的頭發(fā)上盛嘿,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音括袒,去河邊找鬼次兆。 笑死,一個胖子當(dāng)著我的面吹牛锹锰,可吹牛的內(nèi)容都是我干的类垦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼城须,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了米苹?” 一聲冷哼從身側(cè)響起糕伐,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蘸嘶,沒想到半個月后良瞧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡训唱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年褥蚯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片况增。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡赞庶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澳骤,到底是詐尸還是另有隱情歧强,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布为肮,位于F島的核電站摊册,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颊艳。R本人自食惡果不足惜茅特,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棋枕。 院中可真熱鬧白修,春花似錦、人聲如沸重斑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卤恳,卻和暖如春累盗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背突琳。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工若债, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拆融。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓蠢琳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親镜豹。 傳聞我的和親對象是個殘疾皇子傲须,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容