nginx日志切割方法

使用脚本

#!/bin/bash
#日志目录
log_files_path="/data/wwwlogs/"
#待迁入日志目录
log_files_dir=${log_files_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
#需要切割的日志www.chenjie.info_nginx.log则写入www.chenjie.info_nginx,多个日志用空格分隔
log_files_name=(www.chenjie.info_nginx www.teamfat.cn_nginx)
#日志保存天数
save_days=7

mkdir -p $log_files_dir

log_files_num=${#log_files_name[@]}

for((i=0;i<$log_files_num;i++));do
mv ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").log
done
#删除过期日志
find $log_files_path -mtime +$save_days -exec rm -rf {} \; 
#重新打开日志
kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'`

然后加入crontab

0 0 * * * /root/cut_nginx_log.sh

提醒:因为nginx日志写入是基于文件描述符,所以在kill -USR1之前的日志仍会向已经移动的原日志中追加写入。

使用配置

在server块中增加

if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
    set $year $1;
    set $month $2;
    set $day $3;
}

access_log /data/wwwlogs/$year-$month-$day-www.chenjie.info_nginx.log;

时间粒度更细可以使用

if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {
    set $year $1;
    set $month $2;
    set $day $3;
    set $hour $4;
    set $minutes $5;
    set $seconds $6;
}

但是使用这种方法将不能使用系统的写缓冲,每次打开关闭文件对性能会有一定的影响

可以增加open_file_cache指令到server块中,借助该指令特性来提升性能, 即已打开的文件,只有满足一定条件的时候才会重新去check当前fd对应的文件是否合法,是否需要重新打开。

#max : 设置缓存中描述符的最大数量;如果缓存被占满,最近最少使用(LRU)的描述符将被关闭
#inactive : 设置缓存文件描述符在多长时间内没有被访问就关闭; 默认为10秒
#min_uses : 设置在inactive参数指定的时间里, 最少访问多少次才能使文件描述符保留在缓存中;默认为1
#valid :设置一段用于检查超时后文件是否仍以同样名字存在的时间; 默认为60秒
#off :禁用缓存
#配置open_log_file_cache
open_log_file_cache max=10 inactive=60s valid=1m min_uses=2;

提醒:error_log不支持解析变量,所以这种方法不适用于error_log。

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据