内容目录
使用脚本
#!/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。