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组件之间的关系:

    1. Logger:日志记录器,把它关联到应用对应的context上后,主要用于存放日志对象,也可以定义日志类型、别。
    1. Appender:用于指定日志的输出的目的地,可以是控制台,文件,数据库等。
    1. 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>

节点中的conversionWord="msg"属性,就是表示在pattern中指定%msg时,调用的就是converterClass属性中指定的Converter

logback-access使用介绍:

logback-access模块与Servlet容器(如Tomcat、etty)集成,以提供Http访问日志功能。我们可以使用logback-access模块来替换的Tomcat的访问日志。

  1. 将logback-access.jar和logback-core.jar复制到$TOMCAT_HOME/lib目录下。
  2. 修改$TOMCAT_HOME/conf/server.xml中的Host元素,添加:
<Valve class="ch.qos.logback.access.tomcat.LogbackValve"/>
  1. logback默认会在$TOMCAT_HOME/conf目录下查找文件logback-access.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
      ...
</configuration>
posted @ 2020-08-30 16:09  宁川  阅读(519)  评论(0)    收藏  举报