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

推荐订阅源

PCI Perspectives
PCI Perspectives
J
Java Code Geeks
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
博客园 - 聂微东
雷峰网
雷峰网
The Cloudflare Blog
V
V2EX
Hacker News: Ask HN
Hacker News: Ask HN
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hacker News - Newest:
Hacker News - Newest: "LLM"
爱范儿
爱范儿
NISL@THU
NISL@THU
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
腾讯CDC
罗磊的独立博客
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
S
Security Affairs
S
SegmentFault 最新的问题
月光博客
月光博客
P
Privacy International News Feed
Last Week in AI
Last Week in AI
博客园 - Franky
C
Cisco Blogs
宝玉的分享
宝玉的分享
Forbes - Security
Forbes - Security
WordPress大学
WordPress大学
博客园 - 叶小钗
L
LINUX DO - 最新话题
博客园_首页
Spread Privacy
Spread Privacy
大猫的无限游戏
大猫的无限游戏
S
Secure Thoughts
IT之家
IT之家
人人都是产品经理
人人都是产品经理
I
Intezer
W
WeLiveSecurity
C
CERT Recently Published Vulnerability Notes
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
S
Security @ Cisco Blogs
L
Lohrmann on Cybersecurity
美团技术团队

博客园 - dirgo

Oracle关联表删除数据和更新数据 application.yml中Logback相关配置 org/springframework/boot/logging/logback/defaults.xml的内容和作用 logback-spring.xml 中<include resource="org/springframework/boot/logging/logback/base.xml"/>作用 Spring Boot 项目 Logback 日志框架配置文件logback-spring.xml详解 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 的目录结构英文全称(及可能的命名背景)和更详细的说明 利用 Logback 的热加载特性,安全的迁移日志,改变日志保存路径 Linux中查询进程内存占用 iotDB调整内存占用及注意事项 Eclipse Milo 处理PLC&quot;字(Word)&quot;类型,最直接和正确的做法是使用其内置的 UShort 类型 centos7.9安装minio RELEASE.2025-04-22T22-12-26Z centos7.9编译安装nginx 1.28.1 linux(centos7.9)编译安装redis7.2.4 UFW 防火墙常用命令速查表
logback-spring.xml引入了base.xml日志文件默认生成在哪里?
dirgo · 2026-07-24 · via 博客园 - dirgo

[AI生成]
这是一个非常好的问题,你的观察非常敏锐。但我需要澄清一下:base.xml 确实包含了 FILE 这个 Appender 的完整配置和引用,上面的回答没有错。你之所以没有看到日志文件生成,是因为触发了 Spring Boot 的一个特殊设计机制:Lazy Initialization(延迟初始化)。

我来为你详细拆解 base.xml 的真实面貌,以及你为什么没有看到日志文件。

一、 base.xml 的真实源码内容

打开 Spring Boot 的源码,org/springframework/boot/logging/logback/base.xml 的完整内容如下:

<configuration>
    <!-- 引入颜色规则和默认变量格式 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!-- 控制台输出配置,名为 CONSOLE,总是生效 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>${CONSOLE_LOG_CHARSET}</charset>
        </encoder>
    </appender>

    <!-- 
      文件输出配置,名为 FILE。
      注意这里的 class 不是普通的 RollingFileAppender,而是 Spring Boot 自己写的 SizeAndTimeBasedRollingPolicy
    -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${FILE_LOG_CHARSET}</charset>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
            <!-- 省略部分大小和历史配置,都引用了 ${} 变量 -->
        </rollingPolicy>
    </appender>

    <!-- 根日志记录器,同时引用了 CONSOLE 和 FILE -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

如你所见,base.xml 里确确实实定义了 <appender name="FILE"> 并且在 <root> 里进行了 <appender-ref ref="FILE" /> 那为什么你没有看到日志文件呢?


二、 为什么没有生成日志文件?(核心原因)

关键在于 FILE 这个 Appender 里的这一行:
<file>${LOG_FILE}</file>

回顾一下我们在上一个问题中讲的 defaults.xml,里面定义了一个默认变量:
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>

这段复杂的表达式 A:-B 的意思是:如果没配置 A,就用 B。
梳理下来,LOG_FILE 的默认推导顺序是:

  1. 有没有配 logging.file.name
  2. 有没有配 logging.file.path
  3. 有没有配系统环境变量 LOG_TEMP
  4. 都没有?最后兜底写入操作系统的临时目录(如 /tmpC:\Users\用户名\AppData\Local\Temp)下的 spring.log

结合你在 application.yml 中的配置情况,有以下三种可能你没有看到日志文件的原因:

情况 1:你在 yml 里什么都没配(默认兜底)

如果你没有在 application.yml 里配置 logging.file.namelogging.file.pathbase.xml 会尝试把日志写到操作系统的临时文件夹(/tmp/spring.log)。
结果: 你在你的项目根目录下当然找不到日志文件。它藏在系统的 Temp 目录里。

情况 2:你在 yml 里只配了 logging.file.path,但没启动写操作

在 Spring Boot 3.x(以及较新的 2.x 版本)中,为了优化启动速度,RollingFileAppender 采取了延迟初始化。如果你只配了 path,在应用刚启动时,或者应用启动极快的情况下,文件可能还没来得及在磁盘上创建。

情况 3:最常见的情况——配置了 path 但没配 name,或者弄混了它们

Spring Boot 对 logging.file.namelogging.file.path 有极度严苛的区别:

  • logging.file.name: ./logs/myapp.log -> 生效,会在项目根目录的 logs 文件夹下生成 myapp.log。
  • logging.file.path: ./logs -> 生效,会在 logs 文件夹下生成默认名 spring.log
  • 两个都配了 -> Spring Boot 会忽略 path,以 name 为准。

三、 怎么解决,确保日志文件一定生成?

如果你自己的 logback-spring.xml 引入了 base.xml,最简单粗暴的办法是application.yml 中直接指定绝对或相对的文件名

logging:
  file:
    # 明确指定文件名(不要只写路径)
    name: ./logs/my-application.log

只要配了这一行,base.xml 里的 ${LOG_FILE} 就会拿到 ./logs/my-application.log,项目一启动,你立刻就能在项目根目录的 logs 文件夹里看到日志文件了。


四、 给你的终极建议

正如我在上一个关于 yml 配置的回答末尾总结的:
如果你对日志的文件路径、大小有要求,自己写 <appender> 比直接引入 base.xml 要可控得多。

base.xml 是为“零配置”开箱即用设计的,它隐藏了太多 ${} 默认变量,一旦不生效排查起来很痛苦。

如果你不想依赖 Spring Bootjącej 这种默认黑盒,建议你的 logback-spring.xml 这样写(不要引入 base.xml,只引入 defaults.xml 拿颜色规则,剩下的自己写死):

<configuration>
    <!-- 1. 只引入规则,不引入 base.xml 的默认 Appender -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!-- 2. 自己写死控制台 Appender -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 3. 自己写死文件 Appender,不用 ${} 变量,强制指定路径和滚动策略 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 写死文件路径和名字 -->
        <file>./logs/my-app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>./logs/my-app-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <!-- 文件里不要用彩色 pattern,用普通的就行 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 4. 自己组装 root -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

这样写,日志文件 100% 会乖乖生成在你指定的位置,再也不受 application.yml 变量缺失或 Spring Boot 延迟初始化的影响了。