logback 使用介绍
logback 主要分为三个模块:
- logback-core:其他两个模块的基础模块
- logback-classic:log4j的一个改良版本,完整实现了slf4j api,使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
- logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
logback日志级别:(默认级别:DEBUG)
- ERROR - 错误信息
- WARN - 警告信息
- INFO - 运行信息
- DEBUG - 调试信息
- TRACE - 追踪信息
定义于ch.qos.logback.classic.Level
logback会依次读取以下配置文件:
- logback.groovy
- logback-test.xml
- logback.xml
如果均不存在,会采用默认配置 console
logback组件之间的关系:
-
- Logger:日志记录器,把它关联到应用对应的context上后,主要用于存放日志对象,也可以定义日志类型、别。
-
- Appender:用于指定日志的输出的目的地,可以是控制台,文件,数据库等。
-
- Layout:负责把时间转换成字符串,格式化日志信息的输出。在Logback中Layout对象被封装在encoder中。
logback配置实例:
<?xml version="1.0" encoding="UTF-8" ?>
<!--
scan: 配置文件发生变化,重新加载. 默认true
scanPeriod: 配置文件监听时间间隔,单位seconds. 默认1min
debug: logback内部日志信息. 默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--可配置公共变量,下文用${key}获取-->
<property name="pattern" value="[%level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger %L - %m%n"/>
<property name="log_dir" value="logs"/>
<timestamp key="byDay" datePattern="yyyyMMdd" timeReference="contextBirth"/>
<!--控制台输出的 appender-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制输出流对象 默认System.out 可选System.err-->
<target>System.err</target>
<!--日志消息格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--日志输出的文件
appender ch.qos.logback.core.FileAppender
file 日志保存位置
append 是否追加 默认true
prudent 安全写入 默认false(效率低)
-->
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>${log_dir}/logback-file-${byDay}.log</file>
<!--自定义日志消息格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--日志保存为Html格式-->
<appender name="htmlFile" class="ch.qos.logback.core.FileAppender">
<file>${log_dir}/logback-${byDay}.html</file>
<!--html 消息格式配置-->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<Layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%level%d{yyyy-MM-dd HH:mm:ss}%c%M%L%thread%m</pattern>
</Layout>
</encoder>
</appender>
<!--按照日期和大小,拆分和归档压缩-->
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_dir}/logback-rolling-${byDay}.log</file>
<!-- 追加日志到原文件结尾 -->
<append>true</append>
<!--自定义日志消息格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--指定拆分规则-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--按照时间和压缩格式声明 拆分的文件名-->
<fileNamePattern>${log_dir}/log-rolling-%d{yyyy-MM-dd}.log.%i.gz</fileNamePattern>
<!--按照文件的大小拆分-->
<maxFileSize>1MB</maxFileSize>
<maxHistory>7</maxHistory>
</rollingPolicy>
<!--LevelFilter
日志级别过滤器,根据日志级别进行过滤
只统计ERROR级别日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>NEUTRAL</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!--ThresholdFilter
临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
过滤掉 TRACE 和 DEBUG 级别的日志-->
<!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
<!-- <level>INFO</level>-->
<!--</filter>-->
<!--EvaluatorFilter
鉴别器,它以任意的java布尔值表达式作为求值条件,求值条件在配置文件解释过成功被动态编译,布尔值表达式返回true就表示符合过滤条件。
记录日志中包含sivan的日志
-->
<!--<filter class="ch.qos.logback.core.filter.EvaluatorFilter">-->
<!-- <evaluator>-->
<!-- <expression>return message.contains("siva");</expression>-->
<!-- </evaluator>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!--</filter>-->
<!--使用自定义filter-->
<filter class="cn.sivan.config.CustomizeFilter"/>
</appender>
<!--异步日志-->
<appender name="asyncRollFile" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="rollFile"/>
</appender>
<!--root logger 配置-->
<root level="DEBUG">
<appender-ref ref="console"/>
<appender-ref ref="asyncRollFile"/>
</root>
<!--自定义logger additivity:是否继承rootLogger-->
<logger name="cn.sivan" level="INFO" additivity="false">
<appender-ref ref="console"/>
</logger>
</configuration>
logback过滤器(Filter):
过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。
- DENY 日志将立即被抛弃不再经过其他过滤器
- NEUTRAL 有序列表里的下个过滤器过接着处理日志
- ACCEPT 日志会被立即处理,不再经过剩余过滤器
过滤器被添加到
中,为 添加一个或多个过滤器后,可以用任意条件对日志进行过滤。 有多个过滤器时,按照配置顺序执行。
级别过滤器(LevelFilter):
- level 设置过滤级别
- onMatch 用于配置符合过滤条件的操作
- onMismatch 用于配置不符合过滤条件的操作
<!--LevelFilter
日志级别过滤器,根据日志级别进行过滤
只统计ERROR级别日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
临界值过滤器(ThresholdFilter):
临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
<!--ThresholdFilter
临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
过滤掉 TRACE 和 DEBUG 级别的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
求值过滤器(EvaluatorFilter):
- evaluator 鉴别器,常用的鉴别器是JaninoEventEvaluato,也是默认的鉴别器,它以任意的java布尔值表达式作为求值条件,求值条件在配置文件解释过成功被动态编译,布尔值表达式返回true就表示符合过滤条件。evaluator有个子标签
,用于配置求值条件。 - onMatch 用于配置符合过滤条件的操作
- onMismatch 用于配置不符合过滤条件的操作
添加依赖:janino
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.0.7</version>
</dependency>
<!--EvaluatorFilter
鉴别器,它以任意的java布尔值表达式作为求值条件,求值条件在配置文件解释过成功被动态编译,布尔值表达式返回true就表示符合过滤条件。
记录日志中包含sivan的日志
-->
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>return message.contains("siva");</expression>
</evaluator>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
自定义过滤器:
写一个类实现filter接口,并实现decide()方法
package cn.sivan.config;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
public class CustomizeFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
if (event.getMessage().contains("chan")) {
return FilterReply.ACCEPT;
} else {
return FilterReply.DENY;
}
}
}
使用:
<!--使用自定义filter-->
<filter class="cn.sivan.config.CustomizeFilter"/>
常用日志输出格:
- %-5level
- %d
- %c 类的完整名称
- %M method
- %L 行号
- %thread
- %m或%msg
- %n
当官方指定的这些格式不能满足我们的需求,或者是我们需要在打印日志的时候,需要加上一些比较有规律的内容,例如打印本机的hostname/ip等logback本身没有提供的格式的时候,我们就可以自定义日志输出的内容与格式。
实现自定义Converter
import ch.qos.logback.classic.pattern.MessageConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
public class LogMessageConverter extends MessageConverter {
@Override
public String convert(ILoggingEvent event) {
//可以在里面增加其他处理,此处return的字符串就是日志输出的最终内容
return super.convert(event);
}
}
使用:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<conversionRule conversionWord="msg" converterClass="com.xxx.xxx.log.LogMessageConverter" />
//....
</configuration>
在
logback-access使用介绍:
logback-access模块与Servlet容器(如Tomcat、etty)集成,以提供Http访问日志功能。我们可以使用logback-access模块来替换的Tomcat的访问日志。
- 将logback-access.jar和logback-core.jar复制到$TOMCAT_HOME/lib目录下。
- 修改$TOMCAT_HOME/conf/server.xml中的Host元素,添加:
<Valve class="ch.qos.logback.access.tomcat.LogbackValve"/>
- logback默认会在$TOMCAT_HOME/conf目录下查找文件logback-access.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
...
</configuration>

浙公网安备 33010602011771号