Logback配置文件详解——项目架构

简介

Logback是由log4j创始人设计的一个开源日志组件,并通过了严格充分的测试。它主要是占用空间小,执行效率高,还提供了在其他日志框架中没有的独特而有用的特性。

使用

        StringBoot项目默认使用logback组件作为日志管理。在SpringBoot项目中我们不需要额外的添加logback的依赖,因为在spring-boot-starter或者spring-boot-starter-web中已经包含了logback的依赖

Logback读取配置文件的步骤:

  • 在classpath下查找logback-spring.xml
  • 如果文件不存在,则查找logback.xml

配置文件位置

配置文件标签讲解

根节点:<configuration>

  • scan : 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
  • scanPeriod : 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
  • debug : 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
<configuration scan="true" scanPeriod="60 seconds" debug="false">
  		<!-- 其他配置-->
  </configuration>

子节点:<contextName>

<contextName>logback</contextName>

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置好,就不能修改。可以通过%contextName来打印日志上下文名称,一般来说我们不用这个属性,可有可无。

子节点:<property>

<property name="dir" value="./logs"/>

用来定义变量值的标签,它有两个属性 name 和 value:

  • name的值是变量的名称
  • value的值是变量的定义的值,通过该标签定义的值会被插入到logger上下文中,定义变量后可以通过 “ ${变量名} ” 来使用变量

子节点:<appender>

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] %-5level %-50logger{50}: %msg%n</Pattern>
        </encoder>
    </appender>

appender用来格式化日志输出节点,有连个属性name和class,class用来指定那种输出策略

  • ConsoleAppender:日志输出到控制台,类名ch.qos.logback.core.ConsoleAppender
  • FileAppender:日志输入到文件,类名ch.qos.logback.core.FileAppender。作用是将日志输出到文件。目标文件可以指定,如果该文件已经存在,它将根据附加属性的值被追加或截断。
  • RollingFileAppender:滚动记录文件,FileAppender的子类,当符合条件(大小、时间),日志进行切分处理,类名:ch.qos.logback.core.rolling.RollingFileAppender。将FileAppender的功能进行扩展,提供了切割日志文件的功能。例如:RollingFileAppender可以记录日志到一个名为log.txt的文件,一旦满足一定条件,将其日志目标更改为另一个文件。在使用时,RollingFileAppender必须同时具有RollingPolicyTriggeringPolicy设置。但是,如果它的RollingPolicy也实现TriggeringPolicy接口,那么只需要显式地指定前者。
  • TimeBasedRollingPolicy:时间基准滚动策略可能是最流行的滚动策略。它定义了一个基于时间的滚动策略,例如每日或每月。时间的滚动策略承担了翻转的责任,同时也承担了触发的滚动。TimeBasedTriggeringPolicy实现了RollingPolicyTriggeringPolicy接口。类名ch.qos.logback.core.rolling.TimeBasedRollingPolicy
  • SizeAndTimeBasedRollingPolicy:有时候可能希望按日期对文件进行存档,但同时限制每人日志文件的大小,这时候可以使用SizeAndTimeBasedRollingPolicy达到目的。类名ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy
  • SiftingAppender:筛选附加器,类名ch.qos.logback.classic.sift.SiftingAppender ,他下面有个子节点<discriminator>(辨别)discriminator 下有2个子节点<key>和<defaultValue> 其实就是定义与MDC关联的变量key=MDC中put的key defaultValue需要我们随便给个值,不过最好是有意义的SiftingAppender 下有个<sift>子节点这个子节点可以按照appender进行配置
  • SiftingAppender示例:
<property name="dir" value="./logs"/><!-- 定义url变量-->
<appender name="project" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
            <key>requestId</key><!-- MDC.put("requestId",UUID.randomUUID().toString()) -->
            <defaultValue>start</defaultValue>
        </discriminator>
        <sift>
  					<!-- 根据MDC中put的requesId对文件进行分割,文件名为 MDC中put的requesId-->
            <appender name="FILE-${requestId}" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <Prudent>false</Prudent>
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <fileNamePattern>${dir}/%d{yyyy-MM-dd}/${requestId}.log.zip</fileNamePattern>
                </rollingPolicy>
            <encoder>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
        </encoder>
            </appender>
        </sift>
    </appender>

<appender>中的标签

prudent:

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

**RollingFileAppender:**当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。

filter:

简介:

        logback具有过滤器支持。logbcak允许给日志记录器appender配置一个或多个Filter(或者给整体配置一个或多个TurboFilter),来控制:当满足过滤器指定的条件时,才记录日志(或不满足条件时,拒绝记录日志)。logback支持自定义过滤器,当然logback也自带了一些常用的过滤器,在绝大多数时候,自带的过滤器其实就够用了,一般是不需要自定义过滤器的。

logback提供的过滤器支持主要分两大类:

ch.qos.logback.core.filter.Filter
ch.qos.logback.classic.turbo.TurboFilter

过滤器

来源

说明

常用

LevelFilter

Filter

对指定level的日志进行记录(或不记录),对不等于指定level的日志不记录(或进行记录)

ThresholdFilter

Filter

对指定level的日志进行记录(或不记录),对不等于指定level的日志不记录(或进行记录)

EvaluatorFilter

Filter

对满足指定表达式的日志进行记录(或不记录),对不满足指定表达式的日志不作记录(或进行记录)

MDCFilter

TurboFilter

若MDC域中存在指定的key-value,则进行记录,否者不作记录

DuplicateMessageFilter

TurboFilter

根据配置不记录多余的重复的日志

MarkerFilter

TurboFilter

针对带有指定标记的日志,进行记录(或不作记录)

TurboFilter的性能是优于Filter的,这是因为TurboFilter的作用时机是在创建日志事件ILoggingEvent对象之前,而Filter的作用时机是在创建之后。若一个日志注定是会被过滤掉不记录的,那么创建ILoggingEvent对象(包括后续的参数组装方法调用等)这个步骤无疑是非常消耗性能的

这里主要介绍一下ThresholdFilterLevelFilter

  • ThresholdFilter为系统定义的拦截器,例如我们用ThresholdFilter来过滤掉ERROR级别以下的日志不输出到文件中。如果不用记得注释掉,不然你控制台会发现没日志
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>ERROR</level>
</filter>
  • LevelFilter如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,所以我们使用下面的策略,可以避免输出 Error 的日志
<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <!--过滤 Error-->
    <level>ERROR</level>
    <!--匹配到就禁止-->
    <onMatch>DENY</onMatch>
    <!--没有匹配到就允许-->
    <onMismatch>ACCEPT</onMismatch>
</filter>

FilterReply有三种枚举值:

  • DENY:表示不用看后面的过滤器了,这里就给拒绝了,不作记录。
  • NEUTRAL:表示需不需要记录,还需要看后面的过滤器。若所有过滤器返回的全部都是NEUTRAL,那么需要记录日志。
  • ACCEPT:表示不用看后面的过滤器了,这里就给直接同意了,需要记录。

示例:

<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${dir}/%d{yyyy-MM-dd}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <!--日志文件最大的大小-->
            <maxFileSize>50MB</maxFileSize>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter"><!-- 只打印ERROR日志 -->
            <level>ERROR</level>
        </filter>
    </appender>

子节点:<logger>

用来指定某一个包或者具体某一个类的日志打印级别,以及指定<appender> ,<logger>只有一个name属性,一个可选的level和一个可选的addtivity

  • name:用来指定受此loger约束的某一个包或者具体的某一个类。
  • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
  • addtivity:是否向上级loger传递打印信息。默认是true。

示例:

<logger name="com.example" additivity="false" level="ERROR">
        <appender-ref ref="error"/>
    </logger>

控制com.example包下的日志打印,打印级别为“ERROR”;additivity属性为false,表示此loger的打印信息不再向上级传递;指定了名字为“error”的appender;

logger中可以有多个appender-ref

子节点:<root>

root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。level默认是DEBUG。

<root level="debug">
  <appender-ref ref="console" />
  <appender-ref ref="error" />
</root>

示例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>logback</contextName>
    <property name="dir" value="./logs"/>

    <contextListener class="com.ofpay.logback.TtlMdcListener"/>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] %-5level %-50logger{50}: %msg%n</Pattern>
        </encoder>
    </appender>

    <appender name="requestLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <Prudent>false</Prudent>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${dir}/%d{yyyy-MM-dd}/request.log.zip</fileNamePattern>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] %-5level %-50logger{50}: %msg%n</Pattern>
        </layout>
    </appender>

    <!-- 输出到error -->
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${dir}/%d{yyyy-MM-dd}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <!--日志文件最大的大小-->
            <maxFileSize>50MB</maxFileSize>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <!--格式化输出:%d表示日期,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] %-5level %-50logger{50}: %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter"><!-- 只打印ERROR日志 -->
            <level>ERROR</level>
        </filter>
    </appender>

    <root>
        <appender-ref ref="console"/>
        <appender-ref ref="error"/>
    </root>
    <logger name="com.example" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="error"/>
    </logger>
    <logger name="com.example.interceptor.SecureInterceptor" additivity="false">
        <appender-ref ref="requestLog"/>
    </logger>

</configuration>

参考链接: Logback配置文件

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭白鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值