Logback是Log4j的继任者,由Log4j的原作者开发,在性能和功能上都有明显提升,是Spring Boot等主流Java框架默认的日志实现。logback.xml是Logback的核心配置文件,通过XML格式定义日志的输出规则、存储方式、过滤条件等内容,合理的配置可以让日志管理更高效。

logback.xml的基本结构
一个标准的logback.xml文件通常包含<configuration>根标签,内部可以定义属性、上下文监听器、appender、logger、root等核心组件,基本结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 属性定义 -->
<property name="LOG_PATH" value="./logs"/>
<!-- appender定义 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 输出格式配置 -->
</appender>
<!-- logger定义 -->
<logger name="com.example" level="DEBUG"/>
<!-- 根logger定义 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
核心配置项详解
属性定义property
通过<property>标签可以定义全局变量,后续配置中可以通过${变量名}的方式引用,避免重复编写相同的内容,比如日志存储路径、日志文件前缀等。
<!-- 定义日志存储基础路径 --> <property name="LOG_HOME" value="./logs"/> <!-- 定义日志文件名称前缀 --> <property name="APP_NAME" value="my-app"/>
appender输出器配置
appender负责定义日志的输出目的地,常见的输出目的地包括控制台、文件,Logback内置了多种appender实现类,最常用的是ConsoleAppender和RollingFileAppender。
控制台输出appender
控制台输出通常用于开发环境,方便实时查看日志内容,需要配置输出格式编码器PatternLayoutEncoder:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 日志输出格式:时间 日志级别 线程名 类名 日志内容 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
滚动文件输出appender
生产环境通常需要将日志输出到文件,并且按时间或大小滚动切割文件,避免单个日志文件过大,这时候需要使用RollingFileAppender,配合滚动策略使用:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 当前日志文件路径 -->
<file>${LOG_HOME}/${APP_NAME}.log</file>
<!-- 滚动策略:按时间滚动,每天生成一个新的日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 滚动后的日志文件命名规则 -->
<fileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 日志文件保留天数 -->
<maxHistory>30</maxHistory>
<!-- 每个日志文件最大大小,超过则滚动生成新文件 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
logger与root配置
<logger>用来定义特定包或类的日志级别和使用的appender,<root>是所有logger的父级,定义全局的默认日志配置。
<!-- 自定义com.example包的日志级别为DEBUG,使用FILE和CONSOLE两个appender -->
<logger name="com.example" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<!-- 根logger,默认日志级别为INFO,使用CONSOLE和FILE两个appender -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
其中additivity属性表示是否将日志向上级logger传递,默认是true,如果设置为false,则该logger的日志不会传递给root,避免重复输出。
日志级别过滤
如果需要更精细的日志级别过滤,可以使用LevelFilter,比如只输出ERROR级别的日志到特定文件:
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}_error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APP_NAME}_error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 只接收ERROR级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
完整配置示例
以下是一个适配多数Web项目的完整logback.xml配置,包含控制台输出、普通日志文件滚动、错误日志单独存储的功能:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- 配置扫描,修改后30秒自动加载 -->
<property name="LOG_HOME" value="./logs"/>
<property name="APP_NAME" value="demo-app"/>
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 普通日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 错误日志文件 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}_error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APP_NAME}_error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 业务包日志级别 -->
<logger name="com.example" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="ERROR_FILE"/>
</logger>
<!-- 根日志配置 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
</configuration>
配置注意事项
- logback.xml需要放在项目的classpath路径下,比如resources目录,Logback启动时会自动加载该文件。
- 如果同时存在logback.xml和logback-spring.xml,Spring Boot环境下会优先加载logback-spring.xml,后者支持更多Spring相关的配置特性。
- 日志格式中的
%logger{36}表示输出类名,最长显示36个字符,超出部分会缩写,可根据需要调整数值。 - 生产环境建议将控制台日志级别设置为INFO及以上,避免输出过多调试日志影响性能。
LogbackJavalogback_xml日志框架修改时间:2026-06-17 08:39:29