LogBack

首先谈到日志,我们可能听过log4j logback slf4j这三个名词,那么它们之间的关系是怎么样的呢?SLF4J,即简单日志门面(Simple Logging Facade for JAVA),不是具体的日志解决方案,它只服务于各种各样的日志系统。一般来说,slf4j配合log4j、logback进行使用,可以理解为slf4j是标准,log4j和logback是实现.

这次讲下logback-spring.xml的配置

Appender

Logback将执行日志事件输出的组件称为Appender
实现的Appender必须继承 ch.qos.logback.core.Appender接口,这个接口有一个doAppender方法
Appender最终都会负责输出日志,但是他们也可能将日志格式化的工作交给Layout,或者Encoder对象。
logback-spring.xml中有许多的appender,这里我们挑几个项目中用的讲下
ConsoleAppender

顾名思义这个是打印到控制台的appender
AsyncAppender

AsyncAppender记录ILoggingEvents的方式是异步的。它仅仅相当于一个event分配器,因此需要配合其他appender才能有所作为。

RollingFileAppender

RollingFileAppender继承自FileAppender,提供日志目标文件自动切换的功能。例如可以用日期作为日志分割的条件。
RollingFileAppender有两个重要属性,RollingPolicy负责怎么切换日志,TriggeringPolicy负责何时切换.
为了使RollingFileAppender起作用,这两个属性必须设置,但是如果RollingPolicy的实现类同样实现了TriggeringPolicy接口,则也可以只设置RollingPolicy这个属性。

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方法

阅读 341

推荐阅读