Nginx日志按天截取并保存

2018-11-23 21:00:00
赵勤松
原创
2263
摘要:Nginx自身不支持日志按天保存功能,并且如果Nginx运行在Docker容器中,对日志的处理就更加的复杂,在此介绍本人使用的日志处理方法

1.在镜像或已运行的容器中,加入/root/logsplit.sh文件,其内容如下


#!/bin/bash
log_path="/var/log/nginx"
now_ym=$(date -d yesterday +"%Y%m")
now_d=$(date -d yesterday +"%d")
mkdir -p $log_path/$now_ym
for logfile in $log_path/*.access.log
do
    now_file=`echo "$logfile $now_d" | awk -F "$log_path/" '{print $2}' | awk -F ".access.| " '{print $1 "-" $3 ".access." $2}'`
    mv -f "$logfile" "$log_path/$now_ym/$now_file"
done
for logfile in $log_path/*.error.log
do
    now_file=`echo "$logfile $now_d" | awk -F "$log_path/" '{print $2}' | awk -F ".error.| " '{print $1 "-" $3 ".error." $2}'`
    mv -f "$logfile" "$log_path/$now_ym/$now_file"
done
kill -USR1 `cat /var/run/nginx.pid`
简单来说,脚本的执行过程是,创建以年份+月份的分割日志保存目录,先提取后缀为".access.log"的日志文件(有多个虚拟站点,日志的形式为xxx.access.log,xxx.error.log),过滤掉目录部分,再将名称替换为xxx-天数.access.log的形式,然后将原来的日志移动到分割日志保存目录,错误日志也做同样的处理,最后,发送信号给nginx主进程,释放原来的文件句柄,并生成新的日志文件。


保存的logsplit.sh文件,需要使用chmod a+赋予执行权限。


接下来,我们需要在Nginx容器所在的服务器上,使用crontab增加一项定时任务


1 0 * * * /usr/bin/docker exec nginx_site /root/logsplit.sh


这样,每天凌晨00:01分,命名为nginx_site的Docker容器,将自动切割日志


文章分类
联系我们
联系人: powereye
Email: zqs@someapp.cn
QQ: 1134846
微信: powereye