原文网址:Nginx--手写脚本压缩和切分日志(也适用于docker)_IT利刃出鞘的博客-CSDN博客
简介
本文介绍nginx如何手写脚本压缩和切分日志。
1.创建切分日志的脚本
创建脚本文件:/work/tmp/nginx-log_sh(后边要用run-parts去运行,脚本名中不能带.)
内容如下:
法1:每小时执行
bash
#!/bin/bash
# 轮转的时间单位
rotateUnit="1 hour"
# 日志位置
logPath=/work/middle/nginx/logs/
# 文件存活天数(这些天之前的文件会被删掉)
oldFileTtl=20
# 当前时间
nowTime=$(date +"%Y%m%d %H")
# 上一段时间
preTime=$(date -d "$nowTime -$rotateUnit" +"%Y%m%d %H")
# 上一段时间对应的文件名后缀
preTimeFileSuffix=$(date -d "$nowTime -$rotateUnit" +"%Y%m%d_%H")
# 上一段日期对应的目录
preDatePath=$(date -d "$preTime" +"%F")
if [ ! -d "$logPath" ];
then
exit 1
fi
cd $logPath
if [ ! -d "$preDatePath" ];
then
mkdir -p "$preDatePath"
fi
# 将access.log和error.log移到日期文件夹内
mv *.log $preDatePath
# 通知Nginx,让它重新生成一份access.log和error.log
docker exec nginx1.23.3 /bin/bash -c \
"if [ -f /run/nginx.pid ];
then kill -USR1 `docker exec nginx1.23.3 cat /run/nginx.pid`;
echo 日志打包完毕; fi"
# 如果是非docker方式启动nginx,则这样写
# [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
# 压缩文件
pushd $preDatePath
tar czf $preTimeFileSuffix.tar.gz *.log
rm *.log -f
popd
# 删除指定时间之前的日志
find ./ -type d -mtime +$oldFileTtl | xargs rm -rf
find ./ -type d -mtime +2 -empty -delete
备注
如果需要指定时区,可以这么写:
bash
#!/bin/bash
getNowTime()
{
TZ='Asia/Shanghai' date "+%Y%m%d_%H%M"
}
nowTime=$(getNowTime)
法2:每天执行
bash
#!/bin/bash
# 轮转的时间单位
rotateUnit="1 day"
# 日志位置
logPath=/work/middle/nginx/logs/
# 文件存活天数(这些天之前的文件会被删掉)
oldFileTtl=20
# 当前时间
nowTime=$(date +"%Y%m%d")
# 上一段时间
preTime=$(date -d "$nowTime -$rotateUnit" +"%Y%m%d")
# 上一段时间对应的文件名后缀
preTimeFileSuffix=$(date -d "$nowTime -$rotateUnit" +"%Y%m%d")
# 上一段日期对应的目录
preDatePath=$(date -d "$preTime" +"%F")
if [ ! -d "$logPath" ];
then
exit 1
fi
cd $logPath
if [ ! -d "$preDatePath" ];
then
mkdir "$preDatePath"
fi
# 将access.log和error.log移到日期文件夹内
mv *.log $preDatePath
# 通知Nginx,让它重新生成一份access.log和error.log
docker exec nginx1.23.3 /bin/bash -c \
"if [ -f /run/nginx.pid ];
then kill -USR1 `docker exec nginx1.23.3 cat /run/nginx.pid`;
echo 日志打包完毕; fi"
# 如果是非docker方式启动nginx,则这样写
# [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
# 压缩文件
pushd $preDatePath
tar czf $preTimeFileSuffix.tar.gz *.log
rm *.log -f
popd
# 删除指定时间之前的日志
find ./ -type d -mtime +$oldFileTtl | xargs rm -rf
find ./ -type d -mtime +2 -empty -delete
2.创建定时任务
命令
sudo crontab -e
添加如下内容(本处我用两分钟执行一次来测试)
bash
*/2 * * * * run-parts /work/tmp &>>/work/tmp/log.txt
实际应该这样写每小时执行一次:
bash
1 * * * * run-parts /work/tmp &>>/work/tmp/log.txt
编辑完保存后,会自动生效。如下图所示:

3.查看任务是否执行

如图所示,已经执行
4.查看结果

可以发现,已经执行成功