随笔 - 145  文章 - 0  评论 - 6  阅读 - 18万

初探日志框架Logback

一. 背景

最近因为学习项目时需要使用logback日志框架来打印日志, 使用过程中碰到很多的疑惑, 而且需要在控制台打印mybatis执行的sql语句, 于是决定沉下心来

研究一下logback的使用。

 

二. Logback日志级别

Logback日志级别主要有7个, 分别为OFF>ERROR>WARN>INFO>DEBUG>TRACE>ALL

定义在ch.qos.logback.classic.Level类中, 一般只需用ERROR,WARN,INFO,DEBUG这四个级别就行了

Logback处理日志级别时一般遵从输出级别大于等于所声明的级别的日志。

 

三. Filter

自己常用的两个Filter为ch.qos.logback.classic.filter.LevelFilter, ch.qos.logback.classic.filter.ThresholdFilter, 其他的没有深究

LevelFilter: 如果指定lever为debug, 只处理debug级别的日志

ThresholdFilter: 如果指定lever为debug,只处理>=debug级别的日志

<filter>标签写在<appender>标签类, 用来指明<appender>标签处理日志的级别

 

四. <logger> 和 <root> 

<logger>标签有3个属性

name: 可以为具体某个类, 或者一个包名(这样也会处理子包), 必选

lever: 可选, 声明级别, 不写默认继承上一级的lever

additivity: 值为true/false, 是否把打印日志传递到上一级中, 如果<logger>已经指定了<appender>, 应该将值置为false, 否则会重复打印, 即本身打印一次

上一级还会打印。如果没有指定<appender>, 则置为true, 值默认也为true

<root>为最顶层的上级, 上下级应该是根据包名来说的

指定的<logger>会处理对应包名的log, 根据additivity的值判断是否再交给上一级处理

<root>会处理剩下没有指定<logger>来处理的日志, 当然该<logger>的additivity值为true, 那么<root>也会处理该logger处理过的日志, 是一个最大的范围。

 

五. 处理日志级别的流程

如果级别大于 等于<root>或者<logger>设置的级别, 那么会继续与<appender>所设置的过滤方式比较, 否则直接拒绝.

 

六. 详细配置

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?xml version="1.0" encoding="UTF-8"?>
<!-- 60秒扫描一次该配置文件是否有更改 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
 
    <!--声明一个变量, 代表日志文件的根目录 -->
    <property name="LOG_HOME"  value="E:/logs"/>
    <!--输出到控制台 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoding>UTF-8</encoding>
        <encoder>
            <!--打印格式
            %d 日期 24小时制:分:秒.毫秒数
            %p 日志级别优先级
            %c 打印日志的全类名
            %t 线程名
            %m message, 打印的信息
            %n 换行
            -->
            <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern>
        </encoder>
        <!--处理日志级别,  ThresholdFilter处理大于等于level标签声明的级别
        onMatch=accept 符合上述所说级别, 本例大于等于DEBUG级别
        onMismatch=deny 不符合拒绝不输出, 本例小于DEBUG级别
        -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 
    <!-- 输出到文件, 日志级别对应info级别(只能info级别日志被输出) -->
    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/info.log</File>
        <!--将日志按时间打包, 内容追加到文件后, 最大保留最近10天的日志记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/info.log.%d{yyyy-MM-dd}.gz</fileNamePattern>
            <append>true</append>
            <maxHistory>10</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern>
        </encoder>
        <!--处理INFO, 不匹配直接拒接, LevelFilter只处理与level标签相同的级别 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 
    <!-- 输出到文件, 日志级别对应ERROR级别(只能ERROR级别日志被输出) -->
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/error.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error.log.%d{yyyy-MM-dd}.gz</fileNamePattern>
            <append>true</append>
            <maxHistory>10</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
     
     <!-- mybatis sql 日志 -->
    <logger name="com.waston.dao" level="DEBUG" additivity="false">
        <appender-ref ref="console" />
    </logger>
     
     <!-- 整个项目 log 日志 -->
    <logger name="com.waston" level="DEBUG" additivity="false">
        <appender-ref ref="error" />
        <appender-ref ref="info" />
        <appender-ref ref="console"/>
    </logger>
 
    <!--处理<logger>未处理的日志, 比如项目所引用别的框架的日志 -->
    <root level="DEBUG">
        <appender-ref ref="console"/>
        <appender-ref ref="error"/>
        <appender-ref ref="info"/>
    </root>
 
</configuration>

 

上述配置声明3个<appender>

控制台打印DEBUG级别以上的日志

INFO文件只打印INFO级别的日志

ERROR文件只打印ERROR级别的日志

 

七. 结语

记录使用logback的一些疑惑,供自己以后参考学习, 如有人看到指出错误将不胜感激。

 

posted on   wastonl  阅读(392)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示