首先谈到日志,咱们可能听过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方法