Logback 中实现日志持久化的核心是配置 FileAppender 或 RollingFileAppender:前者需指定 file 路径、append(默认 true)、encoder(含 charset 和 pattern);后者推荐用于生产,配合 rollingPolicy(如 SizeAndTimeBasedRollingPolicy)实现按时间/大小滚动、maxHistory 控制保留天数、totalSizeCap 限制总容量,并通过 appender-ref 绑定到 root 或 logger。

Logback 中配置 FileAppender 实现日志持久化,核心是定义一个文件输出的 Appender 并绑定到 Logger,同时注意编码、路径、滚动策略等关键细节。
基础 FileAppender 配置(单文件输出)
最简方式是用 <appender> 声明一个 FileAppender,指定日志文件路径和布局格式:
-
file 属性必须为绝对路径或相对于 JVM 启动目录的相对路径(如
logs/app.log),建议用绝对路径避免定位问题 - append 设为 true 可追加写入,false 每次启动覆盖原文件
- encoder 必须指定 charset(推荐 UTF-8)和 pattern(推荐 %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n)
示例配置片段:
<appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>logs/app.log</file>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
推荐使用 RollingFileAppender(自动归档 + 控制大小)
FileAppender 不支持日志滚动,生产环境应改用 RollingFileAppender,配合 TimeBasedRollingPolicy 或 SizeAndTimeBasedRollingPolicy 实现按天/按大小切分。
立即学习“Java免费学习笔记(深入)”;
-
fileNamePattern 定义归档文件名规则,如
logs/app.%d{yyyy-MM-dd}.%i.log,其中%i支持同天多文件编号 -
maxFileSize 控制单个文件最大体积(如
100MB),需搭配SizeAndTimeBasedRollingPolicy -
maxHistory 设置保留多少天的日志(如
30),过期文件自动删除 -
totalSizeCap 限制所有归档日志总大小(如
3GB),防止磁盘占满
典型配置(按天滚动 + 单日最多 2 个 100MB 文件):
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
绑定 Appender 到 Logger(启用输出)
仅声明 Appender 不会生效,需通过 <root> 或自定义 <logger> 的 <appender-ref> 显式引用:
- root logger 默认级别是 ERROR,若要输出 INFO 及以上,需显式设 level="INFO"
- 多个 Appender 可同时引用(如控制台 + 文件)
- logger name 匹配包路径时,additivity="false" 可阻止日志向上级(如 root)重复输出
示例:
<root level="INFO"><appender-ref ref="ROLLING"/>
<appender-ref ref="CONSOLE"/>
</root>
路径与权限常见问题处理
日志写入失败多数源于路径或权限问题:
- 确保 logs 目录存在且应用进程有写权限,Logback 不会自动创建父级目录(只建最后一级),建议启动前手动创建或用脚本初始化
- Windows 路径中的反斜杠需转义为双反斜杠(
\)或直接用正斜杠(/) - Linux 下注意 SELinux 或容器环境限制,必要时调整上下文或挂载卷权限
-
避免将日志写入项目根目录或 jar 包所在目录(可能无写权限),推荐用系统标准日志目录(如
/var/log/myapp/)或用户主目录子路径


















