日志技术Logback

一、准备工作

引入logback的依赖(springboot中无需引入,在springboot中已经传递了此依赖)

XML 复制代码
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.4.11</version>
</dependency>

二、引入配置文件

引入配置文件 logback.xml,resources 目录下

配置文件解析

XML 复制代码
<configuration>
    <!--  控制台输出  -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level表示级别从左显示5个字符宽度,%logger显示日志记录器的名称, %msg表示日志消息,%n表示换行符  -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>
        </encoder>
    </appender>
    <!--  系统文件输出  -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--  日志文件输出的文件名, %i表示序号  -->
            <FileNamePattern>D:/tlias-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
            <!--  最多保留的历史日志文件数量  -->
            <MaxHistory>30</MaxHistory>
            <!--  最大文件大小,超过这个大小会触发滚动到新文件,默认为 10MB  -->
            <!--一个文件最多存储10MB日志就会换一个新的-->
            <maxFileSize>10MB</maxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level表示级别从左显示5个字符宽度,%msg表示日志消息,%n表示换行符  -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>
        </encoder>
    </appender>
    <!--  日志输出级别  -->
    <!--level="ALL"表示输出所有级别的日志,包括TRACE、DEBUG、INFO、WARN、ERROR-->
    <!--level="OFF"表示不输出任何日志(不区分大小写)-->
    <!--level="DEBUG"表示输出DEBUG及以上级别的日志,包括DEBUG、INFO、WARN、ERROR-->
    <!--level="INFO"表示输出INFO及以上级别的日志,包括INFO、WARN、ERROR-->
    <!--level="WARN"表示输出WARN及以上级别的日志,包括WARN、ERROR-->
    <!--level="ERROR"表示输出ERROR级别的日志-->
    <root level="INFO">
        <!--  控制台输出(引用上面的变量)  -->
        <appender-ref ref="STDOUT"/>
        <!--  文件输出(引用上面的变量)  -->
        <appender-ref ref="FILE"/>
    </root>
</configuration>

(1)控制台输出解析

  1. appender元素

    • 定义了一个名为"STDOUT"的日志输出组件
    • class="ch.qos.logback.core.ConsoleAppender"指定这是一个控制台输出的appender,用于将日志信息输出到控制台
  2. encoder元素

    • class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"表示使用模式布局编码器
    • 作用是将日志事件转换为指定格式的字符串
  3. pattern元素

    • 定义了日志输出的具体格式模板
    • 包含多个占位符,每个占位符有特定含义:
      • %d{yyyy-MM-dd HH:mm:ss.SSS}:输出日期时间,精确到毫秒(可以在打括号内修改想要的格式)
      • [%thread]:输出线程名称,用方括号包围
      • %-5level:输出日志级别,左对齐,固定占5个字符宽度(如果不足五个字符宽度,就会用空格占位)
      • %logger{50}:输出日志记录器名称,最大长度50个字符(如果超过50,就会自动简化)
      • %msg:输出实际的日志消息内容(就是你在写程序是log.debug("xxxx")之类的发来的内容)
      • %n:表示换行符

(2)文件输出解析

  1. appender元素

    • 定义了一个名为"FILE"的日志输出组件
    • class="ch.qos.logback.core.rolling.RollingFileAppender"指定这是一个滚动文件输出的appender,用于将日志信息输出到文件,并支持日志文件的滚动管理
  2. rollingPolicy元素

    • class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"表示使用基于时间和大小的滚动策略
    • 这是一种复合滚动策略,当日志文件达到指定大小或经过指定时间时,会创建新的日志文件
  3. FileNamePattern元素

    • 定义日志文件的命名模式:D:/tlias-%d{yyyy-MM-dd}-%i.log(保存的位置及其文件名)
  4. MaxHistory元素

    • 设置最多保留30个历史日志文件
    • 超过这个数量后,最旧的日志文件会被自动删除
  5. maxFileSize元素

    • 设置单个日志文件的最大大小为10MB
    • 当日志文件大小达到10MB时,会自动创建新的日志文件
  6. encoder元素

    • 与控制台输出类似,定义了日志的格式(区别是写在文件里的日志)
    • 确保文件日志与控制台日志格式一致,便于统一查看

(3)日志开关root

负责指定输出哪些日志,level可以限定输出的日志范围

appender-ref可以引用上方定义的日志记录器

三、日志级别

|-------|----------------------------------------|------------------|
| 日志级别 | 说明 | 记录方式 |
| trace | 追踪,记录程序运行轨迹 【使用很少】 | log.trace("...") |
| debug | 调试,记录程序调试过程中的信息,实际应用中一般将其视为最低级别 【使用较多】 | log.debug("...") |
| info | 记录一般信息,描述程序运行的关键事件,如:网络连接、io操作 【使用较多】 | log.info("...") |
| warn | 警告信息,记录潜在有害的情况 【使用较多】 | log.warn("...") |
| error | 错误信息 【使用较多】 | log.error("...") |

我们想要一个类输出日志,有固定的套路。

只需要在类内定义一个Logger对象(注意我这里使用的是org.slf4j的Logger对象)

复制代码
private static final Logger log = LoggerFactory.getLogger(所属类的字节码文件)

然后在类中就可以通过 log.级别( "日志内容" ) 输出想要的内容。

相关推荐
我命由我123453 小时前
CesiumJS 笔记 - 获取容器中心点、Cartesian3 clone 方法、修改 Cartesian3 对象的高度
前端·javascript·css·前端框架·html·html5·js
Hopebearer_4 小时前
页面突然只剩 DOM?一次静态资源版本错配排查
前端·部署
东风破_4 小时前
ESLint 是什么?为什么你的项目需要它?
前端·后端·代码规范
嘻哈∠※5 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7986 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
圣殿骑士-Khtangc6 小时前
Go字符串高效拼接性能对比与底层原理分析
服务器·前端·golang
zander2586 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅6 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
BigTopOne7 小时前
【ijkplayer】 硬解码流程
前端
kyriewen7 小时前
DeepSeek Harness开源第一天我就上手了——和Claude Code的差距比想象中大
前端·ai编程·deepseek