You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat9不使用log4j如何配置按年月层级存储日志到自定义目录

Tomcat 9 自定义年月结构日志目录配置方案(无需引入log4j)

你当前配置失效的核心原因有两个:

  1. Tomcat自带的AsyncFileHandler不支持直接在路径中写入日期变量,你配置的JDK原生FileHandler规则对AsyncFileHandler无效
  2. catalina.out是catalina.sh脚本输出的重定向文件,不受logging.properties管控,需要单独配置路径和目录创建逻辑

第一步:修改logging.properties配置

将所有Handler的directory配置替换为带系统属性占位符的路径,完整配置如下:

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = /var/log/tomcat/${log.year}/${log.month}
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.maxDays = 90
1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8

2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = /var/log/tomcat/${log.year}/${log.month}
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
2localhost.org.apache.juli.AsyncFileHandler.maxDays = 90
2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8

3manager.org.apache.juli.AsyncFileHandler.level = FINE
3manager.org.apache.juli.AsyncFileHandler.directory = /var/log/tomcat/${log.year}/${log.month}
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.
3manager.org.apache.juli.AsyncFileHandler.maxDays = 90
3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8

4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory = /var/log/tomcat/${log.year}/${log.month}
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.
4host-manager.org.apache.juli.AsyncFileHandler.maxDays = 90
4host-manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8

第二步:修改catalina.sh启动脚本

在脚本最开头(#!/bin/sh声明之后)添加如下内容,完成日期变量注入、目录自动创建、catalina.out路径配置:

# 自定义日志年月目录配置
LOG_YEAR=$(date +%Y)
LOG_MONTH=$(date +%m)
# 自动创建年月目录,避免启动时报路径不存在错误
mkdir -p /var/log/tomcat/${LOG_YEAR}/${LOG_MONTH}
# 传入系统属性供logging.properties解析占位符
export CATALINA_OPTS="$CATALINA_OPTS -Dlog.year=${LOG_YEAR} -Dlog.month=${LOG_MONTH}"
# 修改catalina.out输出路径到对应年月目录
export CATALINA_OUT="/var/log/tomcat/${LOG_YEAR}/${LOG_MONTH}/catalina.out"

注意事项

  • 目录权限:确保/var/log/tomcat目录的所有者为Tomcat运行用户,否则会出现无权创建目录或写日志的问题,可执行chown -R tomcat:tomcat /var/log/tomcat赋权
  • 跨月运行处理:如果Tomcat连续运行跨月,日志会持续写入启动时对应的年月目录,如需自动切换到新月目录,可添加定时任务每月1号凌晨重启Tomcat,crontab示例:
    0 0 1 * * /opt/tomcat/bin/shutdown.sh && sleep 5 && /opt/tomcat/bin/startup.sh
    
    注意将路径替换为你实际的Tomcat bin目录路径
  • 无效配置清理:你原有配置中的1catalina.java.util.logging.FileHandler.pattern行属于无效配置,可直接删除

内容的提问来源于stack exchange,提问作者KNCK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:06:06