nginx日志切割总结
Nginx日志切割
方法1(脚本+定时执行):
#step1:加脚本 cut_nginx_log.sh,主进程把USR1信号发给worker,worker接到这个信号后,会重新打开日志文件
#!/bin/bash
logs_path="/usr/local/nginx-1.6.0/logs"
log_name="access.log"
pid_path="/usr/local/nginx-1.6.0/logs/nginx.pid"
mv ${logs_path}/${log_name} ${logs_path}/"access-"$(date --date="LAST DAY" "+%Y-%m-%d").log
kill -USR1 `cat ${pid_path}`
#find ${logs_path} -name "*.log" -mtime +30 -delete
#step2:crontab 定时跑脚本,每天0点0分执行脚本
crontab -e
0 0 * * * /usr/local/nginx-1.6.0/logs/cut_nginx_log.sh
方法2(使用logrotate):
vi /etc/logrotate.d/nginx
/usr/local/nginx/logs/www.willko.cn.log /usr/local/nginx/logs/nginx_error.log {
notifempty
daily
sharedscripts;
postrotate
/bin/kill -USR1 `/bin/cat /usr/local/nginx/nginx.pid`
endscript
}
多个日志以空格分开,
notifempty 如果日志为空则不做轮询
daily 每天执行一次
postrotate 日志轮询后执行的脚本
这样,每天都会自动轮询,生成nginx.log.1-n
方法3(conolog):没试过
方法4(修改配置文件):
在server{}里加上:
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})")
{
set $ng_year $1;
set $ng_month $2;
set $ng_day $3;
set $ng_hour $4;
set $ng_minutes $5;
set $ng_seconds $6;
}
access_log logs/$ng_year-$ng_month-$ng_day-$ng_hour-host.access.log;
*注意这个要有pcre库,不然if处会报错
Q&A:
1、nginx日志实现自动分割了吗?
实际上没有,但是用apt/yum安装nginx时会自动配置logrotate。
logrotate作为一个/etc/cron.daily/logrotate任务每日定时执行。
你往/etc/logrotate.d/下添加配置文件logrotate执行时会自动根据配置文件进行日志归档。
如apt-get安装的Nginx官方源的日志归档配置文件为 /etc/logrotate.d/nginx。
参考:
http://www.iyunv.com/thread-110386-1-1.html
https://www.oschina.net/question/258792_173849