关于禅道开源版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的请求,直接丢弃目标请求的日志
注意事项
- 路径替换:请将配置中的
E:/zentao2178Install/ZenTao/替换为你实际的禅道安装路径 - 不要在同一行添加注释:Apache配置文件中,配置项后边同行不得写注释,否则服务启动会报错
- 重启禅道服务:修改配置后需要重启禅道服务才能生效
- 清理旧日志:建议先删除之前生成的超大日志文件,释放磁盘空间
效果验证
修改配置并重启禅道后,观察日志文件大小变化。正常情况下,日志文件应该保持在合理的大小范围内,不会再出现MB级甚至GB级的异常增长。
这个问题本质上是禅道某个组件(可能是宣纸IM集成)在不断轮询 /zentao/x.php 接口,但由于认证失败返回401,每次请求都被记录到日志中。通过Apache的环境变量过滤机制,我们可以精准地跳过这些无用日志的记录,从根本上解决日志膨胀问题。
虽然这是一个"治标不治本"的方案(没有解决为什么会有大量401请求的根本原因),但在不影响正常使用的情况下,能够有效控制日志文件大小,避免磁盘空间被快速占满。