使用logback-spring.xml配置日志

完整配置如下(有bug,后面解决,并且后面逐一分析):

<?xml version="1.0" encoding="UTF-8" ?>

<configuration>

    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                <!--
                    %d{HH:mm:ss.SSS} 表示输出到毫秒的时间
                    %msg 日志文本
                    %n 换行
                -->
                %d - %msg%n
            </pattern>
        </layout>
    </appender>

    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>F:/project/sell/log/info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>


    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>F:/project/sell/log/error.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="consoleLog" />
        <appender-ref ref="fileInfoLog" />
        <appender-ref ref="fileErrorLog" />
    </root>

</configuration>

首先解析第一部分consoleLog:

<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>
            <!--
                %d{HH:mm:ss.SSS} 表示输出到毫秒的时间
                %msg 日志文本
                %n 换行
            -->
            %d - %msg%n
        </pattern>
    </layout>
</appender>

在这里插入图片描述

要想这个配置起效果,就要启用这个appender,那么我们该如果启用这个appender呢?只需要如下配置即可

后面的也相同,都是在这样配置启用,后面就不多提了

<root level="info">
    <appender-ref ref="consoleLog" />
    <appender-ref ref="fileInfoLog" />
    <appender-ref ref="fileErrorLog" />
</root>

在这里插入图片描述

控制台的运行效果:

在这里插入图片描述

现在我们解析第二部分fileInfoLog

 <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>F:/project/sell/log/info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

在这里插入图片描述

最后是fileErrorLog

跟上面的fileInfoLog大同小异,滚动策略都是一样的,只是改了一个后面的文件名称,改了过滤器的类

上面用的是ch.qos.logback.classic.filter.LevelFilter这个类

而这里用的是ch.qos.logback.classic.filter.ThresholdFilter这个类

那有人会问了,这两个类有什么区别呢?

ThresholdFilter这个类,是只输出指定级别的日志,如我们配置的

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>ERROR</level>
</filter>

表示只拦截error级别的日志信息.如果我们只想要输出,error级别的日志是没有问题的,error是级别最高的,所以只输出error的信息.

但如果用这个配置,拦截info级别的日志,就会出现问题了,因为info是中间级别的,不是最高级别,如果用这个拦截了info,除了输出info级别的日志信息外,还会输出warn级别和error级别,两个比它高的级别的日志.所以不能会这个类来配置info级别的file文件

那要怎么样才可能让一个文件只输出info级别的日志信息呢?

那就要用到下面这个类了LevelFilter.

LevelFilter这个类,要配合onMatch标签,如果该标签中是DENY则,说明拦截该标签级别,onMismatch标签是ACCEPT,则说明,没抓取到上面lever级别的日志,就accept,即放行.

查看源码,可以看到有三种FilterReply可以选择DENY、NEUTRAL、ACCEPT.

第一个是禁止,很容易理解

第二个是中立,就是忽略当前规则,进入下一条规则

第三个是接受、处理,被当前规则所接受、处理

在这里插入图片描述

<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>ERROR</level>
    </filter>
    <encoder>
        <pattern>
            %msg%n
        </pattern>
    </encoder>
    <!--滚动策略-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--路径-->
        <fileNamePattern>F:/project/sell/log/error.%d.log</fileNamePattern>
    </rollingPolicy>
</appender>

在这里插入图片描述

最后纠错一下第二部分是有bug的

如果只想要输出info级别的日志,像上面那样配置,是只过滤了error级别的日志信息,warn级别的日志并没有过滤掉,我这边做一下修改(后面发现的,现在做一下补充修改)

##fileInfoLog

<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
        <pattern>
            %d - %msg%n
        </pattern>
    </encoder>
    <!--滚动策略-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--路径-->
        <fileNamePattern>F:/project/sell/log/info.%d.log</fileNamePattern>
    </rollingPolicy>
</appender>

在这里插入图片描述

这样就可以了!!!

最终版logback-spring.xml(bug修复):

<?xml version="1.0" encoding="UTF-8" ?>

<configuration>

    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                <!--
                    %d{HH:mm:ss.SSS} 表示输出到毫秒的时间
                    %msg 日志文本
                    %n 换行
                -->
                %d - %msg%n
            </pattern>
        </layout>
    </appender>

    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %d - %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>F:/project/sell/log/info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>


    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %d - %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>F:/project/sell/log/error.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="consoleLog" />
        <appender-ref ref="fileInfoLog" />
        <appender-ref ref="fileErrorLog" />
    </root>

</configuration>

猜你喜欢

转载自blog.csdn.net/qq_37924905/article/details/108969351