关于禅道开源版21.7.8日志异常增长问题的一个解决办法

因工作需要,老大叫我安装一个禅道做需求管理,来记录咱干的活,和避免后面需求扯皮。安装第一天没有问题,第二三四天也没发现,直至第五天后,不得了了,我的盘符爆红了!经查如下:

禅道日志文件大小截图

是日志的问题,单个日志文件竟然达到了十几个G!!!

进到目录下去发现,日志以肉眼可见的速度MB级增长。

问题排查

使用Git Bash进入日志目录,使用以下命令查看日志实时输出:

tail -f -n 20 日志文件名

发现是本地一直在请求 /zentao/x.php 这个资源却返回401状态码,导致日志疯狂写入。

经禅道官网查询无果,社区类似的解决办法皆无效!

解决方案

遂只能停止禅道,自己尝试修改配置。找到Apache的配置文件在以下两个位置:

  • 禅道安装根路径\etc\apache\httpd.conf
  • 禅道安装根路径\bin\apache\conf\httpd.conf

或者直接搜文件名也行,总共就这两个位置有的。实际更改也只需要更改 \etc\apache\httpd.conf 这个就可以了,禅道启动的时候会把这个重写到另一个配置里去。

修改Apache配置文件

找到日志配置部分,注释掉原来的配置:

# logs
#ErrorLog "|%SERVICE_PATH%apache/bin/rotatelogs.exe %LOG_PATH%apache/error_%Y%m%d.log 10M"
#LogLevel warn
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#CustomLog "|%SERVICE_PATH%apache/bin/rotatelogs.exe %LOG_PATH%apache/access_%Y%m%d.log 10M" combined

添加新的配置:

# 仅记录严重错误,级别调至最低
ErrorLog "E:/zentao2178Install/ZenTao/logs/apache/error.log"
LogLevel emerg
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

# 核心规则:只记录 非 easysoft/xuan.im + 非 /zentao/x.php + 非 401 的请求
SetEnvIf User-Agent "easysoft/xuan.im" skip_log
SetEnvIf Request_URI "/zentao/x.php" skip_log
SetEnvIf Status "401" skip_log

# 只记录未被标记为 skip_log 的请求(即直接丢弃目标请求的日志)
CustomLog "E:/zentao2178Install/ZenTao/logs/apache/access.log" combined env=!skip_log
⚠️ 重要提示:配置项后边同行不得写注释,不然服务会报错起不来!

配置说明

  • ErrorLog:将错误日志改为固定文件,不再按日期分割
  • LogLevel emerg:仅记录最严重的紧急错误,大幅减少错误日志量
  • SetEnvIf规则:设置环境变量标记需要跳过的日志
    • User-Agent "easysoft/xuan.im":跳过禅道客户端的请求日志
    • Request_URI "/zentao/x.php":跳过该接口的访问日志
    • Status "401":跳过所有401未授权响应的日志
  • CustomLog env=!skip_log:只记录未被标记为skip_log的请求,直接丢弃目标请求的日志

注意事项

  1. 路径替换:请将配置中的 E:/zentao2178Install/ZenTao/ 替换为你实际的禅道安装路径
  2. 不要在同一行添加注释:Apache配置文件中,配置项后边同行不得写注释,否则服务启动会报错
  3. 重启禅道服务:修改配置后需要重启禅道服务才能生效
  4. 清理旧日志:建议先删除之前生成的超大日志文件,释放磁盘空间

效果验证

修改配置并重启禅道后,观察日志文件大小变化。正常情况下,日志文件应该保持在合理的大小范围内,不会再出现MB级甚至GB级的异常增长。

这个问题本质上是禅道某个组件(可能是宣纸IM集成)在不断轮询 /zentao/x.php 接口,但由于认证失败返回401,每次请求都被记录到日志中。通过Apache的环境变量过滤机制,我们可以精准地跳过这些无用日志的记录,从根本上解决日志膨胀问题。

虽然这是一个"治标不治本"的方案(没有解决为什么会有大量401请求的根本原因),但在不影响正常使用的情况下,能够有效控制日志文件大小,避免磁盘空间被快速占满。