根本原因是catalina_base与catalina_home指向不一致或未正确设置,导致logging.properties加载路径错误、${catalina.base}未解析或handler类不匹配juli。

Tomcat 日志输出不走 catalina.out 或日志写到奇怪路径,根本原因往往不是配置错,而是环境变量没生效或被覆盖——尤其是 CATALINA_BASE 和 CATALINA_HOME 指向不一致时,${catalina.base}/logs 就会落进意料之外的目录。
为什么改了 logging.properties 还不生效
Tomcat 启动时优先读取 ${catalina.base}/conf/logging.properties,而不是 ${catalina.home}/conf/logging.properties。如果没显式设置 CATALINA_BASE,它默认等于 CATALINA_HOME;但一旦你用脚本、IDE 或服务方式启动(比如 Windows service.bat install),CATALINA_BASE 很可能被设为另一个路径(如 C:\Program Files\Apache Software Foundation\Tomcat 9.0),导致你编辑的配置文件根本没被加载。
- 检查实际生效的配置路径:启动后看日志头行,通常会打印类似
Using CATALINA_BASE: D:\tomcat-instance -
logging.properties中所有directory都基于${catalina.base}解析,不是当前工作目录,也不是CATALINA_HOME - Windows 下双击
startup.bat时,CATALINA_BASE默认未设,所以走CATALINA_HOME;但用service.bat install安装为服务后,CATALINA_BASE会被设为服务安装路径
CATALINA_BASE 和 CATALINA_HOME 必须区分清楚
这两个变量不是可选的“便利设置”,而是 Tomcat 多实例部署的核心机制。混淆它们会导致日志、临时文件、webapps 路径全部错乱。
-
CATALINA_HOME:只读,指向 Tomcat 二进制分发包根目录(含bin/、lib/) -
CATALINA_BASE:可写,指向某个具体实例的配置和运行时数据目录(含conf/、logs/、temp/、work/、webapps/) - 若只部署单实例,可让两者相同;但只要想共用一套 bin/lib、隔离多套配置(比如 dev/test 环境),就必须显式设置
CATALINA_BASE - 在
bin/setenv.bat(Windows)或bin/setenv.sh(Linux)中设置最安全,比系统环境变量优先级高,且不会污染全局
日志路径中 ${catalina.base} 不展开?检查 FileHandler 的 class 是否正确
Tomcat 自带 JULI 日志系统支持 ${catalina.base} 变量替换,但前提是 handler 类必须是 org.apache.juli.FileHandler,不是 JDK 原生的 java.util.logging.FileHandler。
- 打开
${catalina.base}/conf/logging.properties,确认每条 handler 的类名是:1catalina.org.apache.juli.FileHandler,不是java.util.logging.FileHandler - 如果误用了 JDK 原生 handler,变量不会解析,路径里出现字面量
${catalina.base},日志直接写失败或落到当前目录 - 验证方式:故意把
directory设成一个不存在的路径(如/xxx/logs),然后启动 Tomcat;如果日志文件没生成且控制台无报错,大概率是 handler 类不对
想把日志统一写到自定义路径?别硬改 logging.properties,用 setenv 注入系统变量
硬编码绝对路径在迁移时极难维护,而 ${catalina.base} 又受限于实例结构。更灵活的方式是在启动前注入自定义变量,再在配置里引用。
- 在
bin/setenv.bat中添加:set LOG_DIR=D:\my-logs - 在
logging.properties中写:1catalina.org.apache.juli.FileHandler.directory = ${LOG_DIR} - 注意:JULI 只识别
${xxx}格式的变量,且仅限于 JVM 系统属性或环境变量;setenv中的set是环境变量,会被自动转为系统属性 - 避免用
${catalina.home}指向日志目录——它应只放只读资源;日志属于运行时数据,应归属CATALINA_BASE或独立路径
真正容易被忽略的是:setenv 文件必须存在且有执行权限(Linux 下需 chmod +x),且不能有 BOM 或 UTF-8 with BOM 编码(Windows 下记事本保存极易中招),否则 Tomcat 启动脚本会静默跳过它,变量根本没设上。











