惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
AI
AI
T
Threat Research - Cisco Blogs
Know Your Adversary
Know Your Adversary
C
CERT Recently Published Vulnerability Notes
V
Vulnerabilities – Threatpost
S
Securelist
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tenable Blog
C
Cybersecurity and Infrastructure Security Agency CISA
AWS News Blog
AWS News Blog
Cisco Talos Blog
Cisco Talos Blog
Cloudbric
Cloudbric
P
Privacy & Cybersecurity Law Blog
N
News and Events Feed by Topic
D
Docker
博客园 - 司徒正美
Last Week in AI
Last Week in AI
Google DeepMind News
Google DeepMind News
O
OpenAI News
人人都是产品经理
人人都是产品经理
腾讯CDC
博客园 - 三生石上(FineUI控件)
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Scott Helme
Scott Helme
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 叶小钗
N
News and Events Feed by Topic
J
Java Code Geeks
D
DataBreaches.Net
爱范儿
爱范儿
N
Netflix TechBlog - Medium
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
H
Heimdal Security Blog
F
Full Disclosure
L
LINUX DO - 最新话题
W
WeLiveSecurity
Blog — PlanetScale
Blog — PlanetScale
V
V2EX
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - Franky
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42

博客园 - dirgo

Oracle DataBaseLink 提示密码过期 梅特勒托-托利多衡器串口连续输出数据格式的说明 utf-8编码详解 mybaits updateWrapper更新报错:无效的列类型: 1111 @RequestPart和@RequestParam有什么区别 如何避免Mass Assignment漏洞? 关于vxe-table v4 导出大数据量excel浏览器卡死问题的解决 开源的Linux换源和安装docker脚本 wsl常用命令 使用网页静默打印 在Oracle中,授予用户角色和权限 Linux下查看当前哪些端口在监听状态,哪些端口在连接状态 mobaxterm常用配置 Windows下udp工具 Oracle表空间用户授权创建dblink等操作 用nmap扫描找出某个网段下空闲的ip脚本 Oracle 19c 常用运维 SQL Linux下设置CDB/PDB 环境的Oracle19c开机启动 Oracle是 CDB/PDB 环境下,让PDB在数据库启动后自动打开 怎样禁止dbeaver点击导航中数据库自动切换sql编辑器所属的数据库 Oracle 19c占内存高的解决方法 sudo -i -u zhangsan 与su - zhangsan区别,在现代 Linux 系统中,推荐使用 sudo 进行权限切换 Linux 的目录结构英文全称(及可能的命名背景)和更详细的说明 Linux中查询进程内存占用 iotDB调整内存占用及注意事项 Eclipse Milo 处理PLC"字(Word)"类型,最直接和正确的做法是使用其内置的 UShort 类型 centos7.9安装minio RELEASE.2025-04-22T22-12-26Z centos7.9编译安装nginx 1.28.1 linux(centos7.9)编译安装redis7.2.4 UFW 防火墙常用命令速查表
利用 Logback 的热加载特性,安全的迁移日志,改变日志保存路径
dirgo · 2026-02-25 · via 博客园 - dirgo

要利用 Logback 的热加载特性,关键不在于文件放在哪里(因为 JAR 包内的文件无法热修改),而在于必须将配置文件外置。

默认情况下,Spring Boot 打包 JAR 时,logback.xml 会被打包进 JAR 包内部的 BOOT-INF/classes/ 目录下。这部分内容是只读的,无法在运行时修改,因此无法实现热加载。

实现方案:将配置文件放在 JAR 包同级目录

Spring Boot 的日志加载机制有一个优先级顺序:它会优先读取 JAR 包同级目录下的配置文件

1. 放置位置

logback.xml(或 logback-spring.xml)文件放在与你的 JAR 包相同的目录下。

目录结构示例:

/opt/myapp/
├── myapp.jar
└── logback-spring.xml  <-- 放在这里

2. 核心配置:开启热加载

仅仅把文件放在外面还不够,你必须在 logback-spring.xml 的根节点 <configuration> 上添加 scan 属性。

配置示例 (logback-spring.xml):

<configuration scan="true" scanPeriod="30 seconds">
    <!-- 
        scan="true": 开启热加载特性
        scanPeriod="30 seconds": 默认每60秒检测一次,这里改为30秒
    -->
  
    <property name="LOG_PATH" value="/data/logs/myapp" />
  
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/info.log</file>
        <!-- 其他配置... -->
    </appender>
  
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

3. 操作步骤

按照以下步骤操作,即可实现不停机修改日志目录:

  1. 提取配置: 将 JAR 包内的 logback-spring.xml 复制出来,放在 JAR 包同级目录。
  2. 重启应用(仅一次): 重启应用,让 Spring Boot 读取外部的配置文件。
    • 验证:启动后查看日志输出,确认配置已生效。
  3. 热修改:
    • 修改外部 logback-spring.xml 中的日志路径(例如从 /var/log 改为 /data/logs)。
    • 等待 scanPeriod 指定的时间(如 30 秒)。
    • Logback 会检测到文件变化,自动重新加载配置。
    • 新的日志内容将写入新目录,旧日志文件保留在原位。

原理补充说明

  1. Spring Boot 的加载优先级:
    Spring Boot 日志系统初始化时,会按照以下顺序寻找配置文件(优先级由高到低):

    1. 当前目录下的 logback-spring.xml (即 JAR 包同级目录)
    2. 当前目录下的 logback.xml
    3. Classpath (JAR 包内) 下的 logback-spring.xml
    4. Classpath (JAR 包内) 下的 logback.xml

    因为外部文件优先级最高,且文件系统是可写的,所以 Logback 的 scan 特性才能生效。

  2. 关于 logback.xml vs logback-spring.xml
    推荐使用 logback-spring.xml。这是 Spring Boot 特有的命名,它允许你使用 <springProfile> 等高级特性(针对不同环境配置不同日志策略),并且同样支持 scan 热加载。

总结

位置: 放在 JAR 包同级目录。
前提: 必须在 <configuration> 标签中配置 scan="true"
效果: 修改外部 XML 文件中的路径后,Logback 会在设定的扫描周期内自动检测并应用新配置,无需重启 Java 进程。这是最安全、优雅的日志目录迁移方案。