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容器,将自动切割日志