使用crontab + shell脚本方式,每天定时分隔access.log和error.log,防止文件过大带来的问题。
效果参考
# tree /var/log/nginx
/var/log/nginx/
├── access.log
├── archive
│ ├── access_2025-08-22.log.gz
│ └── error_2025-08-22.log.gz
├── error.log
└── log-split.sh
1 directory, 5 files
log-split.sh
脚本默认会删除超过30天的日志文件,相关命令为:find $ARCHIVE_DIR -type f -name "*.gz" -mtime +30 -exec rm -f {} \;
如果你不想删除或者需要调整保留时间,修改这句里面的参数即可。
命令解析:find $ARCHIVE_DIR -type f -name "*.gz" -mtime +30 -exec rm -f {} \;
用于清理指定目录中超过 30 天的 .gz
压缩文件。
部分 | 说明 |
---|---|
find |
查找文件的命令 |
$ARCHIVE_DIR |
环境变量,表示要搜索的归档目录(如这里的 /var/log/nginx/archive ) |
-type f |
只查找普通文件,不包括目录或链接 |
-name "*.gz" |
文件名以 .gz 结尾(通常是 gzip 压缩文件) |
-mtime +30 |
文件的修改时间超过 30 天前(即 30 天之前修改的) |
-exec rm -f {} \; |
对每个找到的文件执行 rm -f 删除,{} 代表文件名,\; 表示命令结束 |
添加定时任务
crontab -e
插入内容
# 每天凌晨1点自动执行
0 1 * * * /etc/nginx/nginx_log_rotate.sh
提示:脚本存放路径,根据自己放的来哦
将脚本映射到docker容器内部,如下面将conf.d目录映射给了nginx的/etc/nginx/conf.d
volumes:
- ./conf.d:/etc/nginx/conf.d
将脚本放到主机的./conf.d目录
主机添加crontab执行docker容器命令
sudo docker exec -it nginx /bin/bash /etc/nginx/conf.d/log-split.sh
命令解析
sudo docker exec -it
固定命令nginx
nginx是nginx容器的名称,也可以使用容器id代替/bin/bash /etc/nginx/conf.d/log-split.sh
执行容器里面的/etc/nginx/conf.d/log-split.sh
脚本添加到crontab
crontab -e
# 每天凌晨1点自动执行
sudo docker exec -it nginx /bin/bash /etc/nginx/conf.d/log-split.sh
https://www.leftso.com/article/2508221550121266.html