Logback简介与配置详解

简介: 在开发和维护Spring Boot应用程序时,一个强大而灵活的日志框架是至关重要的。Spring Boot默认集成了Logback,一个高性能的Java日志框架。本文将介绍如何配置Logback以满足你的日志记录需求。

在开发和维护Spring Boot应用程序时,一个强大而灵活的日志框架是至关重要的。Spring Boot默认集成了Logback,一个高性能的Java日志框架。本文将介绍如何配置Logback以满足你的日志记录需求。

logback.jpg

Logback简介

官方网址:https://logback.qos.ch/

Logback是一款为Java应用程序设计的日志框架,旨在提供高性能、灵活性和可扩展性。它是log4j项目的继任者,并被广泛用于Java应用程序的日志记录。

Logback分为三个主要的模块:logback-core、logback-classic、和logback-access。

  • logback-core提供了基本的日志功能。

  • logback-classic建立在logback-core之上,兼容SLF4J和log4j API,提供了一套强大的日志框架。

  • logback-access允许通过servlet容器的访问日志功能来记录HTTP请求。()

Spring Boot默认集成了Logback,并用INFO级别输出到控制台。 由于Spring Boot通常使用嵌入式Servlet容器,并且这些容器已经具备了记录访问日志的功能,因此在默认情况下不需要引入logback-access。

Logback 具有许多优点,其中一些包括:

  • 性能高效

Logback被设计为高性能的日志框架,具有较低的运行时开销。

异步日志记录和可配置的缓冲机制有助于提高性能。

  • 灵活的配置

Logback的配置文件采用XML格式(通常命名为logback.xml),允许用户以声明式的方式配置日志输出。

支持通过Groovy脚本进行配置,提供更灵活的选项。

  • 丰富的Appender

提供多种Appender用于将日志输出到不同的目的地,如控制台、文件、数据库等。

支持异步Appender以提高性能。

  • 简单而强大的 API

Logback 的 API 设计简单易用,同时具备强大的功能。它继承了 Log4j 的 API,但在设计上进行了改进和优化,使得开发者可以更容易地集成和使用。

  • 广泛的社区支持

作为一个成熟而受欢迎的日志框架,Logback 拥有广泛的社区支持和活跃的开发者社群。这意味着开发者可以在社区中获取丰富的资源、文档和支持。

springboot配置logback

在src/main/resources目录下创建名为logback-spring.xml或者logback.xml的Logback配置文件。Spring Boot默认会加载类路径下的logback-spring.xml文件。如果该文件不存在,则会尝试加载logback.xml。如果我们使用的是别的配置名称,则需要在springboot 的application.yml配置文件中经行配置:

# 日志配置
logging:
  config: classpath:mylogback.xml

logback.xml的配置完整示例

  • 同步配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志存放路径 -->
    <property name="log.path" value="/data/xjdoc/logs" />
    <!-- 日志输出格式 -->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 系统模块日志级别控制  -->
    <logger name="cn.xj" level="info" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />

    <!--系统操作日志-->
    <root level="info">
          <appender-ref ref="console" />
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>

</configuration>
  • 异步配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志存放路径 -->
    <property name="log.path" value="/data/xjdoc/logs" />
    <!-- 日志输出格式 -->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="async_file_info" class="ch.qos.logback.classic.AsyncAppender">
        <!--  当队列的剩余容量小于这个阈值并且当前日志level为 TRACE, DEBUG or INFO ,则丢弃这些日志。  -->
        <discardingThreshold>0</discardingThreshold>
        <!--  更改默认的队列的深度,该值会影响性能.默认值为256  -->
        <queueSize>1024</queueSize>
        <!--  新增这行为了打印栈堆信息  -->
        <includeCallerData>true</includeCallerData>
        <!--  添加附加的appender,最多只能添加一个  -->
        <appender-ref ref="file_info"/>
    </appender>
    <appender name="async_file_error" class="ch.qos.logback.classic.AsyncAppender">
        <!--  当队列的剩余容量小于这个阈值并且当前日志level为 TRACE, DEBUG or INFO ,则丢弃这些日志。  -->
        <discardingThreshold>0</discardingThreshold>
        <!--  更改默认的队列的深度,该值会影响性能.默认值为256  -->
        <queueSize>1024</queueSize>
        <!--  新增这行为了打印栈堆信息  -->
        <includeCallerData>true</includeCallerData>
        <!--  添加附加的appender,最多只能添加一个  -->
        <appender-ref ref="file_error"/>
    </appender>
    <appender name="async_file_debug" class="ch.qos.logback.classic.AsyncAppender">
        <!--  当队列的剩余容量小于这个阈值并且当前日志level为 TRACE, DEBUG or INFO ,则丢弃这些日志。  -->
        <discardingThreshold>0</discardingThreshold>
        <!--  更改默认的队列的深度,该值会影响性能.默认值为256  -->
        <queueSize>1024</queueSize>
        <!--  新增这行为了打印栈堆信息  -->
        <includeCallerData>true</includeCallerData>
        <!--  添加附加的appender,最多只能添加一个  -->
        <appender-ref ref="file_debug"/>
    </appender>

    <!-- 系统模块日志级别控制  -->
    <logger name="cn.xj" level="info" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />


    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="async_file_info" />
        <appender-ref ref="async_file_error" />
    </root>

</configuration>

logback.xml的配置详解

配置文件基本结构如下:

_20231219173450.jpg

property

    <!-- 日志存放路径 -->
 <property name="log.path" value="/data/xjdoc/logs" />
    <!-- 日志输出格式 -->
 <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

<property> 元素用于定义属性,允许在配置文件的其他地方引用这些属性;说明如下:

log.path

这行配置定义了一个名为 log.path 的属性,其值为 /data/xjdoc/logs。这个属性可以在配置文件的其他地方通过 ${log.path} 进行引用。这种属性的定义用于集中管理日志存放路径,方便在多处引用时进行统一修改。

log.pattern

这行配置定义了一个名为 log.pattern 的属性,其值为一个复杂的日志输出格式。这个属性可以在配置文件的其他地方通过 ${log.pattern} 进行引用。这种属性的定义用于集中管理日志输出格式,方便在多处引用时进行统一修改。

  • %d{HH:mm:ss.SSS}: 输出日志的时间戳,精确到毫秒。
转换模式 结果示例
%d 2006-10-20 14:06:49,812
%date 2006-10-20 14:06:49,812
%date{ISO8601} 2006-10-20 14:06:49,812
%date{HH:mm:ss.SSS} 14:06:49.812
%d{HH:mm:ss.SSS} 14:06:49.812
%date{dd MMM yyyy;HH:mm:ss.SSS} 20 oct. 2006;14:06:49.812
  • [%thread]: 输出线程名。
  • %-5level: 输出日志级别,左对齐占5个字符的宽度。
  • %logger{20}: 输出 logger 名称,占20个字符的宽度。
  • [%method,%line]: 输出调用方法和行号。
  • %msg: 输出日志消息。
  • %n: 输出平台特定的换行符。

appender

 <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
   <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
   <!-- 日志最大的历史 60天 -->
   <maxHistory>60</maxHistory>
  </rollingPolicy>
  <encoder>
   <pattern>${log.pattern}</pattern>
  </encoder>
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
 </appender>

<appender> 元素

  • ConsoleAppender(控制台输出)

class="ch.qos.logback.core.ConsoleAppender"

用于将日志输出到控制台。

主要用于开发和调试时观察日志。

  • FileAppender(文件输出)
    class="ch.qos.logback.core.FileAppender"

用于将日志输出到文件。

可以配置文件路径、文件名等参数。

  • RollingFileAppender(滚动文件输出)

class="ch.qos.logback.core.RollingFileAppender"

在FileAppender的基础上,支持滚动策略,可以按照一定规则滚动创建日志文件,例如按时间、文件大小等。

  • AsyncAppender(异步输出)

class="ch.qos.logback.core.AsyncAppender"

用于异步输出日志,可以提高性能,特别适用于高吞吐的应用。

包装其他Appender,将日志记录过程异步执行。

滚动策略 (<rollingPolicy> 元素)

  • TimeBasedRollingPolicy(基于时间的滚动策略)

基于时间的滚动策略,按照一定的时间间隔滚动创建新的日志文件。

fileNamePattern 属性定义了日志文件名的格式,可以包含时间相关的占位符,例如 %d{yyyy-MM-dd}。

  • SizeAndTimeBasedRollingPolicy(基于时间和大小的滚动策略)

同时基于时间和文件大小的滚动策略,既可以按照时间滚动,又可以在达到一定文件大小时滚动创建新的日志文件。

fileNamePattern 属性定义了日志文件名的格式,可以包含时间相关的占位符,例如 %d{yyyy-MM-dd}。

maxFileSize 属性定义了每个日志文件的最大大小。

  • FixedWindowRollingPolicy(固定窗口的滚动策略)

固定窗口的滚动策略,按照一定的窗口大小滚动创建新的日志文件。

  • SizeBasedTriggeringPolicy(基于大小触发滚动策略)

基于文件大小触发滚动的策略,当当前日志文件大小达到一定阈值时触发滚动。

  • TimeBasedFileNamingAndTriggeringPolicy(基于时间的文件命名和触发策略)

基于时间的文件命名和触发策略,按照一定的时间间隔和文件名格式触发滚动。

<encoder> 元素

用于配置日志的输出格式,${log.pattern} 引用了之前定义的 log.pattern 属性,以保持一致的日志输出格式。

<filter> 元素

  • 使用 ch.qos.logback.classic.filter.LevelFilter 过滤器,仅接受 INFO 级别的日志记录。
  • onMatch 指定匹配时的操作为接受(ACCEPT)。
  • onMismatch 指定不匹配时的操作为拒绝(DENY)。

logger

    <!-- 系统模块日志级别控制  -->
    <logger name="cn.xj" level="info" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />

name 属性

通常使用类名或者包名来指定 Logger。

level 属性

level 属性定义了日志级别,表示记录的日志消息级别。可选值包括 trace、debug、info、warn、error。

  • TRACE(追踪)

TRACE 是最低级别的日志,用于记录程序的详细执行信息。

这个级别通常用于调试,输出对程序执行流程的跟踪信息。

TRACE 级别的日志量较大,一般情况下不会在生产环境中启用。

  • DEBUG(调试)

DEBUG 级别用于输出调试信息,有助于开发者定位和解决问题。

DEBUG 日志通常包含详细的变量信息、方法调用堆栈等。

在开发和测试阶段中,可以启用 DEBUG 日志以获取更多的信息。

  • INFO(信息)

INFO 级别用于记录一般性的信息,表示程序执行的正常流程。

INFO 日志用于显示重要的运行时信息,通常在生产环境中启用。

这是默认的日志级别,如果没有明确指定级别,则使用 INFO。

  • WARN(警告)

WARN 级别用于记录一些可能需要关注的问题,但不会导致程序失败。

WARN 日志表明程序可能遇到了某些问题或潜在的错误,但仍然可以继续执行。

这是一个提醒性的级别。

  • ERROR(错误)

ERROR 级别用于记录程序的错误和异常情况。

ERROR 日志表示程序遇到了严重的问题,可能导致程序崩溃或无法正常运行。

ERROR 级别的日志通常需要开发者及时关注和处理。

root

在 Logback 配置文件中,<root> 元素用于配置根 Logger,它是整个日志系统的根节点。根 Logger 拥有最高级别,通常用于设置全局的日志级别和全局的 Appender(附加器)。

    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="async_file_info" />
        <appender-ref ref="async_file_error" />
    </root>

level 属性

level 属性定义了根 Logger 的默认日志级别,表示整个日志系统的最低输出级别。例如,上例中设置为 INFO,表示只输出 INFO 级别及以上的日志。

<appender-ref> 元素

<appender-ref> 元素用于引用一个或多个 Appender,将其关联到根 Logger,即设置根 Logger 的输出目的地。可以有多个<appender-ref>元素,表示将日志输出到多个目的地。

总结

Logback 是一个强大且灵活的日志框架,它为 Java 应用程序提供了先进的日志记录功能。通过合理配置,可以满足各种应用场景的需求,从而更好地帮助开发者监控和调试应用程序。希望本文对 Logback 的简介和配置提供了清晰的指导,使你能更好地使用 Logback 进行日志记录。

目录
相关文章
|
JSON 安全 Java
security跨域配置
security跨域配置
545 3
|
消息中间件 存储 缓存
3分钟白话RocketMQ系列—— 如何消费消息
3分钟白话RocketMQ系列—— 如何消费消息
1739 0
|
8月前
|
人工智能 弹性计算 自然语言处理
零门槛上手OpenClaw!阿里云极简部署,三步解锁专属超级AI助理!
OpenClaw是可私有部署的AI数字员工框架,支持通义千问、GPT等多模型,能写代码、查资料、管邮件、自动化办公。阿里云提供一键部署方案:买服务器→开通百炼API→图形化配置,三步搞定,安全高效!
605 12
|
3月前
|
文字识别 安全 Windows
【2026】Umi-OCR文字识别工具:截图/批量/PDF识别全支持
Umi-OCR是一款免费开源的离线OCR软件,支持截图、图片、扫描PDF文字识别,全程本地运行,保障隐私安全。提供Paddle(高性能)和Rapid(低配兼容)双引擎,操作简单,支持批量处理与多格式导出。
Linux 数据库 Python
688 0
|
8月前
|
XML Java API
【Logback】Logback 日志框架 与 SLF4J绑定、三层模块、MDC链路追踪、异步日志、滚动策略
本文系统梳理 Logback日志框架,涵盖基础定位、核心架构、配置体系、高级特性、性能优化、框架集成、最佳实践与问题排查八大维度,深入解析SLF4J绑定、三层模块、MDC链路追踪、异步日志、滚动策略及企业级落地要点,助力Java开发者高效掌握生产级日志治理能力。
|
8月前
|
缓存 监控 算法
吃透 JVM 内存管理与调优:从底层原理到生产级落地实战(JDK17 专属)
本文深入解析JDK17 JVM内存管理与调优。首先剖析JVM内存模型核心架构,包括线程私有区域(程序计数器、虚拟机栈、本地方法栈)和共享区域(堆、元空间等)。通过可复现代码示例演示栈溢出、堆OOM等异常场景,并介绍jstat、jstack等排查工具。详细讲解垃圾回收算法(标记-清除、复制、整理)及JDK17主流收集器(G1、ZGC等)的适用场景。重点阐述生产级调优全流程:从监控定位问题到参数优化,提供常见问题排查方案和参数配置最佳实践。
850 6
|
设计模式 Java Apache
Springboot项目优化日志logback-spring.xml详解
Commons Logging和Slf4j是日志门面(门面模式是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接 口,使 得子系统更容易使用)。log4j和Logback则是具体的日志实现方案。可以简单的理解为接口与接口的实现,调用这只需要关注接口而无需关注具体的实现,做到解耦
3242 0
Springboot项目优化日志logback-spring.xml详解
|
XML Java API
Java日志通关(四) - Logback 介绍
作者日常在与其他同学合作时,经常发现不合理的日志配置以及五花八门的日志记录方式,后续作者打算在团队内做一次Java日志的分享,本文是整理出的系列文章第四篇。
|
存储 前端开发 Java
Element el-upload 文件上传/图片上传/拖拽上传/附带参数/附带请求头部详解
文目录 1. 前言 2. 基本用法 2.1 前端部分 2.2 后端部分 2.3 获取后端返回信息 3. 外观功能介绍 3.1 拖拽上传 3.2 显示图片 3.3 设置文件列表样式 3.4 显示提示信息 4. 事件功能介绍 4.1 限制上传文件数量 4.2 限制上传文件类型和大小 4.3 移除文件处理 4.4 手动上传 5. 附带参数 6. 附带请求头部 7. 小结
8721 0