Logback示例解析
<configuration><!-- 环境变量 --><springProperty scope="context" name="app.name" source="spring.application.name" defaultValue="application"/><!-- 日志存放路径 --><property name="log.path" value="./logs" /><!-- 日志输出格式 --><property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%method,%line] - %msg%n" /><!-- 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 常规日志文件 --><appender name="file_all" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/${app.name}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}/${app.name}.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>7</maxHistory><totalSizeCap>1GB</totalSizeCap></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 日志级别控制 --><logger name="com.lg" level="info" /><logger name="org.springframework" level="info" /><logger name="com.alibaba.nacos" level="info" /><!-- 根日志配置 --><root level="info"><appender-ref ref="console" /><appender-ref ref="file_all" /> <!-- 使用已定义的 file_all --></root>
</configuration>
该配置文件是 Logback(Java 常用日志框架)的 XML 格式配置,主要用于定义日志的输出策略、格式、存储路径及日志级别控制。以下是逐部分的详细解析:
一、环境变量与基础属性
<!-- 环境变量 -->
<springProperty scope="context" name="app.name" source="spring.application.name" defaultValue="application"/>
- 作用:通过 Spring 的
Environment
获取属性值,用于动态配置日志相关参数(如应用名称)。 - 细节:
scope="context"
:表示该属性会被放入 Logback 的上下文(LoggerContext
)中,供其他组件引用。source="spring.application.name"
:从 Spring 环境中获取spring.application.name
的值(通常是 Spring Boot 项目的应用名)。defaultValue="application"
:若 Spring 环境中未配置spring.application.name
,则使用默认值 “application”。
二、全局属性定义
<!-- 日志存放路径 -->
<property name="log.path" value="./logs" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%method,%line] - %msg%n" />
log.path
:定义日志文件的存储根路径(当前为项目根目录下的./logs
目录)。log.pattern
:定义日志的输出格式(控制台和文件均使用此格式),各占位符含义:%d{yyyy-MM-dd HH:mm:ss.SSS}
:时间戳(精确到毫秒)。%thread
:线程名。%-5level
:日志级别(如INFO
、ERROR
,左对齐占5字符)。%logger{36}
:Logger 名称(类全限定名,最多显示36字符)。%method
:日志调用方法名。%line
:日志调用行号。%msg
:日志具体内容。%n
:换行符。
三、日志输出器(Appender)
日志输出器负责将日志发送到目标目的地(如控制台、文件)。
3.1 控制台输出器(ConsoleAppender)
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${log.pattern}</pattern></encoder>
</appender>
- 作用:将日志输出到控制台(终端)。
encoder
:定义日志的编码格式(此处直接复用全局的log.pattern
)。
3.2 滚动文件输出器(RollingFileAppender)
<!-- 常规日志文件 -->
<appender name="file_all" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/${app.name}.log</file> <!-- 当前日志文件路径 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}/${app.name}.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 滚动后文件名模式 --><maxHistory>7</maxHistory> <!-- 最多保留7天的历史日志 --><totalSizeCap>1GB</totalSizeCap> <!-- 所有滚动文件总大小上限 --></rollingPolicy><encoder><pattern>${log.pattern}</pattern> <!-- 复用全局格式 --></encoder>
</appender>
- 作用:将日志写入文件,并按时间滚动归档,避免单一日志文件过大。
- 关键配置:
<file>
:当前正在写入的日志文件路径(${log.path}/${app.name}.log
,如./logs/application.log
)。<rollingPolicy>
:滚动策略(此处使用基于时间的滚动)。<fileNamePattern>
:滚动后文件的命名模式(%d{yyyy-MM-dd}
表示按日期滚动,如application.2024-05-20.log
)。<maxHistory>
:保留最近7天的日志文件,超过的会被删除。<totalSizeCap>
:所有滚动文件的总大小不超过1GB(Logback 1.1.7+ 支持)。
<encoder>
:日志格式与控制台一致,保证日志内容可读性。
四、日志级别控制(Logger)
<!-- 日志级别控制 -->
<logger name="com.lg" level="info" /> <!-- 自定义包,输出INFO及以上级别 -->
<logger name="org.springframework" level="info" /> <!-- Spring框架,输出INFO及以上 -->
<logger name="com.alibaba.nacos" level="info" /> <!-- Nacos客户端,输出INFO及以上 -->
- 作用:针对特定包(或类)设置日志级别,控制其输出粒度。
- 细节:
name
:包名(支持通配符,如com.lg.*
匹配com.lg
下的所有子包)。level
:日志级别(TRACE
<DEBUG
<INFO
<WARN
<ERROR
<ALL
/OFF
)。- 示例:
com.lg
包下的日志仅输出INFO
、WARN
、ERROR
级别(DEBUG
及以下被过滤)。
五、根日志配置(Root Logger)
<!-- 根日志配置 -->
<root level="info"> <!-- 根日志级别为INFO --><appender-ref ref="console" /> <!-- 输出到控制台 --><appender-ref ref="file_all" /> <!-- 输出到滚动文件 -->
</root>
- 作用:全局日志的默认配置(未被其他
logger
匹配的日志会使用根日志配置)。 - 细节:
level="info"
:根日志级别为INFO
,即所有INFO
及以上级别的日志会被处理(除非被更具体的logger
覆盖)。<appender-ref>
:引用已定义的appender
(此处关联控制台和滚动文件输出器)。
六、总结
该配置实现了以下核心功能:
- 动态应用名:通过
springProperty
自动获取 Spring 应用名,日志文件名动态生成。 - 控制台输出:实时查看日志(开发环境常用)。
- 滚动文件存储:按日期滚动日志文件,限制保留天数和总大小,避免磁盘占满。
- 分级日志级别:针对特定包(如业务包、框架包)设置独立日志级别,平衡日志详细度和性能。
- 统一日志格式:控制台和文件日志格式一致,便于问题排查。
七、注意事项
- 目录权限:需确保
log.path
(如./logs
)目录存在且有写入权限,否则日志无法生成(Logback 不会自动创建目录)。 - 版本兼容性:
totalSizeCap
需 Logback 1.1.7+ 版本支持,旧版本需移除该配置。 - 日志级别继承:
logger
的name
支持包路径继承(如com.lg.service
会继承com.lg
的日志级别,除非单独配置)。