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及以上级别的才能被打印出来。