使用logback-spring.xml配置日志

    科技2026-03-09  7

    完整配置如下(有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>
    Processed: 0.016, SQL: 9