Logback配置文件解析


发布于 2016-03-12 / 31 阅读 / 0 评论 /
通过logback配置文件讲解logback配置的使用

1.logback配置文件

案例配置如下所示:

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <property name="taskType_key" value="${taskType:-00}"/>
    <property name="taskId_mould_key" value="${taskId_mould:-0}"/>
    <property name="taskId_key" value="${taskId:-000}"/>
    <property name="tries_key" value="${tries:-1}"/>
    <property name="log_dir" value="/data/var/logs/${taskType_key}/${taskId_mould_key}/${taskId_key}"/>
    <property name="fileTag" value="${curRunDate:-0000}-${runnerStateCode}"/>
    <property name="log_pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %p %.20C.%M [%t] [line:%L]- %m%n"/>
    <property name="maxHistory" value="7"/>

    <timestamp key="bySecond" datePattern="yyyyMMddHHmmss"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <pattern>${log_pattern}</pattern>
        </encoder>
    </appender>

    <appender name="ERROR-APPENDER" class="ch.qos.logback.core.FileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <file>${log_dir}/${fileTag}-error-log-${tries_key}.${bySecond}.log</file>
        <encoder>
            <pattern>${log_pattern}</pattern>
        </encoder>
        <append>false</append>
    </appender>

    <appender name="WARN-APPENDER" class="ch.qos.logback.core.FileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        <file>${log_dir}/${fileTag}-warn-log-${tries_key}.${bySecond}.log</file>
        <encoder>
            <pattern>${log_pattern}</pattern>
        </encoder>
        <append>false</append>
    </appender>

    <appender name="INFO-APPENDER" class="ch.qos.logback.core.FileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <file>${log_dir}/${fileTag}-info-log-${tries_key}.${bySecond}.log</file>
        <encoder>
            <pattern>${log_pattern}</pattern>
        </encoder>
        <append>false</append>
    </appender>

    <appender name="DEBUG-APPENDER" class="ch.qos.logback.core.FileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <file>${log_dir}/${fileTag}-debug-log-${tries_key}.${bySecond}.log</file>
        <encoder>
            <pattern>${log_pattern}</pattern>
        </encoder>
        <append>false</append>
    </appender>

    <appender name="ALL-APPENDER" class="ch.qos.logback.core.FileAppender">

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ALL</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <file>${log_dir}/${fileTag}-all-log-${tries_key}.${bySecond}.log</file>
        <encoder>
            <pattern>${log_pattern}</pattern>
        </encoder>
        <append>false</append>
    </appender>

    <logger name="org.apache.kafka.clients" level="OFF"></logger>
    <logger name="org.apache.kafka.common.metrics" level="OFF"></logger>
    <logger name="org.apache.kafka.common.security.authenticator" level="OFF"></logger>
    <logger name="org.apache.kafka.common.network" level="OFF"></logger>
    <logger name="org.apache.kafka.common.utils" level="OFF"></logger>

    <root>
        <level value="DEBUG"/>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ALL-APPENDER"/>
        <appender-ref ref="ERROR-APPENDER"/>
        <appender-ref ref="INFO-APPENDER"/>
        <appender-ref ref="WARN-APPENDER"/>
        <appender-ref ref="DEBUG-APPENDER"/>
    </root>
</configuration>

2.logback配置元素

logback配置文件中,主要有四种元素——configuration、logger、appender、pattern、root。

2.1.<configuration>配置

<configuration>表示整个配置文件的整体结构,可配置以下三个属性:

scan:默认为true,表示配置文件发生改变时,将会重新加载配置。

scanPeriod:默认为1分钟。检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认为毫秒。只有当scan为true时,此属性才能生效。

debug:默认为false。当被设置为true时,将打印出logback内部日志信息,实时查看logback运行信息。

2.2.<logger>配置

<logger>用来设置某某一个包或者具体某一个类的日志打印级别,以及指定<appender>。<logger>可以包含零个或者多个<appender-ref>元素,标识这个appender将会添加到这个logger。

<logger>节点的属性有以下三个:

name:用来指定受此logger约束的某一个包或者具体的某一个类。

level:用来设置打印级别,五个常用打印级别从低至高依次为TRACE、DEBUG、INFO、WARN、ERROR。如果未设置此级别,那么当前logger会继承上级(比如root)的级别。

additivity:是否向上级logger传递打印信息,默认为true。

2.3.<root>配置

<root>也是<logger>元素,但它是根logger,只有一个level属性,因为它的name就是ROOT,这个可以从ch.qos.logback.classic.LoggerContext构造函数中发现,代码如下所示:

public LoggerContext() {
    super();
    this.loggerCache = new ConcurrentHashMap<String, Logger>();
 
    this.loggerContextRemoteView = new LoggerContextVO(this);
    this.root = new Logger(Logger.ROOT_LOGGER_NAME, null, this);
    this.root.setLevel(Level.DEBUG);
    loggerCache.put(Logger.ROOT_LOGGER_NAME, root);
    initEvaluatorMap();
    size = 1;
    this.frameworkPackages = new ArrayList<String>();
}

其中,Logger全称为org.slf4j.Logger。

在案例中<root>的level为DEBUG,表示日志级别大于或等于DEBUG的日志交给名为STDOUT、ALL-APPENDER、ERROR-APPENDER、INFO-APPENDER、WARN-APPENDER、DEBUG-APPENDER的6个appender处理。

2.4.<appender>配置

<appender>是<configuration>的子节点,是负责写日志的组件。

<appender>有以下两个必要的属性:

(1)name:指定<appender>的名称。

(2)class:指定<appender>类的全限定名,常见的类有FileAppender、RollingFileAppender和ConsoleAppender。

<appender>内部有以下五个重要的子节点。

2.4.1.<file>

表示写入的文件名,可以使相对目录也可以是绝对目录,如果上级目录不存在则自动创建。

2.4.2.<appender>

如果为true表示日志被追加到文件结尾,如果是false表示清空文件。

2.4.3.<prudent>

如果为true表示日志会被安全地写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认为false。

2.4.4.<encoder>

表示输出格式。主要负责两件事:把日志信息转化为字节数组;把字节数组写到输出流。

<encoder>是0.9.19版本之后引进的,以前的版本使用<layout>,logback极力推荐的是使用<encoder>而不是<layout>。

目前PatternLayoutEncoder是唯一有用的且默认的encoder,有一个<pattern>节点,用来设置日志的输入格式,使用”%+转换符"的方式,如果要输出"%"则必须使用"\%"对"%"进行转义。

2.4.5.<filter>

用于在当前给到的日志级别下再进行一次过滤,最基本的filter有ch.qos.logback.classic.filter.LevelFilter和ch.qos.logback.classic.filter.ThresholdFilter。

LevelFilter的使用案例如下所示:

<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>WARN</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
</filter>

上述配置表示:对匹配到WARN级别时做了ACCEPT(接受),对未匹配到WARN级别时做了DENY(拒绝),只能打印出WARN级别的日志。

ThresholdFilter使用案例如下所示:

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

上述配置表示:将日志级别小于INFO的全部进行过滤,如果指定了DEBUG级别,但是只有INFO及以上级别的才能被打印出来。