首先談到日誌,咱們可能聽過log4j logback slf4j這三個名詞,那麼它們之間的關係是怎麼樣的呢?SLF4J,即簡單日誌門面(Simple Logging Facade for JAVA),不是具體的日誌解決方案,它只服務於各類各樣的日誌系統。通常來講,slf4j配合log4j、logback進行使用,能夠理解爲slf4j是標準,log4j和logback是實現.spring
此次講下logback-spring.xml的配置app
Appender異步
Logback將執行日誌事件輸出的組件稱爲Appender
實現的Appender必須繼承 ch.qos.logback.core.Appender接口,這個接口有一個doAppender方法
Appender最終都會負責輸出日誌,可是他們也可能將日誌格式化的工做交給Layout,或者Encoder對象。
logback-spring.xml中有許多的appender,這裏咱們挑幾個項目中用的講下
ConsoleAppenderide
顧名思義這個是打印到控制檯的appender
AsyncAppenderui
AsyncAppender記錄ILoggingEvents的方式是異步的。它僅僅至關於一個event分配器,所以須要配合其餘appender纔能有所做爲。日誌
RollingFileAppendercode
RollingFileAppender繼承自FileAppender,提供日誌目標文件自動切換的功能。例如能夠用日期做爲日誌分割的條件。
RollingFileAppender有兩個重要屬性,RollingPolicy負責怎麼切換日誌,TriggeringPolicy負責什麼時候切換.
爲了使RollingFileAppender起做用,這兩個屬性必須設置,可是若是RollingPolicy的實現類一樣實現了TriggeringPolicy接口,則也能夠只設置RollingPolicy這個屬性。xml
RollingPolicy對象
負責日誌文件的切換以及重命名
TimeBasedRollingPolicy:日誌滾動策略基於時間的,例如根據天數,月份繼承
SentryAppender
經過Raven上報的sentry
@Override protected void append(ILoggingEvent iLoggingEvent) { // Do not log the event if the current thread is managed by raven if (RavenEnvironment.isManagingThread()) return; RavenEnvironment.startManagingThread(); try { if (raven == null) initRaven(); if (minLevel != null && !iLoggingEvent.getLevel().isGreaterOrEqual(minLevel)) return; Event event = buildEvent(iLoggingEvent); raven.sendEvent(event); } catch (Exception e) { addError("An exception occurred while creating a new event in Raven", e); } finally { RavenEnvironment.stopManagingThread(); } }
AmqpAppender
將日誌發送到mq中,再由消費者推送到Logstash
啓用Appender
appender-ref 表示啓用哪些appender
<!-- root級別 DEBUG --> <root level="DEBUG"> <appender-ref ref="STDOUT" /> <appender-ref ref="ASYNC_DEFAULT" /> <if condition='property("sentryEnable").contains("true")'> <then> <appender-ref ref="Sentry" /> </then> </if> <if condition='property("elkEnable").contains("true")'> <then> <appender-ref ref="ELK" /> </then> </if> </root>
LayoutBase
Layout是logback中負責把日誌事件轉換成成字符串的組件,能夠理解爲日誌中須要哪些字段,能夠經過layout來作.
能夠自定義本身的layout
doLayout
主要負責組裝須要上報的信息,好比一些自定義的requestId,reqKey 等
繼承LayoutBase<ILoggingEvent>重寫doLayout方法