部署过程
生产环境部署的nginx日志超大(几G以上),决定改变这一现状,利用nginx自带的功能进行日志自动拆分,也方便后续运维。我采用的是nginx access_log支持变量形式,把当前请求时间中的年、月、日提取出来,文件以年月日形式命名。
我的部署方式,在location里增加如下:
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
}
access_log /data/nginx/logs/${year}_${month}_${day}_access.log main;
我在nginx 1.22.0 1.22.1两版本测试均能生效,切割出现了2024_01_18_access.log;
排坑指南
1. 日志没有按照预想
当我发布生产环境时候,发现没有一行日志输出,测试环境、生产环境增加的就这几行配置完全一样。
出现问题第一怀疑是版本原因,于是我本地虚机安装并启动了1.22.0、1.22.1版本的nginx进行测试,完全没问题。
于是尝试从生产环境查看错误日志error.log,发现了一些猫腻。打印请求日志时检查/usr/local/nginx/html目录是否存在,失败就会跳过打印日志。
testing "/usr/local/nginx/html" existence failed (2: No such file or directory) while logging request
我重建了该目录,发现日志果然按照预想的拆分、输出了。
2. 本地环境复测
编译安装的nginx都有html目录,我把该目录删掉,尝试请求。日志果然没有拆分,并且同样出现了该错误。
3.问题说明
通过查阅资料,在该官方指导手册出找到了解释
该特性自0.7.6版本可以使用,并且打印日志时会检查root directory,检查失败就不会打印log。