日志系统

logback日志配置

2022-12-03  本文已影响0人  virtual灬zzZ

实现了门面日志@slf4j,其配置大同小异,logback、log4j2基本差不太多,以下看springboot默认的日志系统-----logback的配置。

日志从低到高为 TRACE、DEBUG、INFO、WARN、ERROR

logback日志的在spring boot里的配置需要在src/main/resources下,application.properties同级,放一个logback的xml文件,一般起名字为logback-spring.xml。但也可以自定义名字,在yml或properties文件引入就好,如下:

logging:
  config: classpath:logback-spring-kk.xml

示例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
   <!-- spring boot 自带的日志配置 只有控制台输出 -->
    <!--  <include resource="org/springframework/boot/logging/logback/base.xml" />-->

    <contextName>logback</contextName>
    <property name="dir" value="./logs"/>
    
     <springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="xxx"/>

    <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>

详解

根节点:<configuration>

<configuration scan="true" scanPeriod="60 seconds" debug="false">
        其他配置略
</configuration>

子节点include

<!-- spring boot 自带的日志配置 只有控制台输出 -->
 <include resource="org/springframework/boot/logging/logback/base.xml" />

引入别的配置

子节点:<contextName>

<contextName>logback</contextName>

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

子节点:<property>

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

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

子节点:<springProperty>

 <springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="xxx"/>

读取spring的配置文件,application.yml或properties中的属性变量,引入到logback配置文件中使用

子节点:<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用来指定那种输出策略
  1. TimeBasedRollingPolicy:时间基准滚动策略可能是最流行的滚动策略。它定义了一个基于时间的滚动策略,例如每日或每月。时间的滚动策略承担了翻转的责任,同时也承担了触发的滚动。

  2. TimeBasedTriggeringPolicy:实现了RollingPolicy和TriggeringPolicy接口。类名ch.qos.logback.core.rolling.TimeBasedRollingPolicy

  3. SizeAndTimeBasedRollingPolicy:有时候可能希望按日期对文件进行存档,但同时限制每人日志文件的大小,这时候可以使用SizeAndTimeBasedRollingPolicy达到目的。类名ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy

<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:
filter:

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

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

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

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

这里主要介绍一下ThresholdFilter和LevelFilter:
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>ERROR</level>
</filter>
<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>
            <!-- 编码 -->
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter"><!-- 只打印ERROR日志 -->
            <level>ERROR</level>
        </filter>
    </appender>

子节点:<logger>

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

示例:

<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标签知道指定了日志级别,那么以根标签为准,没有则以当前追加器日志级别为准
如果root没有值,则默认是debug级别

有效优先级别:root > logger > appender

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

参考:
官网

上一篇 下一篇

猜你喜欢

热点阅读