一、nginx日志分割
方法一:
只需要在server配置中,配置一个脚本即可,目前这个是定义了日,可以定义到秒。
set多添加几个参数即可
server {
listen 80 default_server;
root "/app/www/public";
if ($time_iso8601 ~ "(\d{4})-(\d{2})-(\d{2})") {
set $time $1-$2-$3;
}
# 精确到秒
# if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})")
# {
set $time $1-$2-$3-$4-$5-$6;
# }
access_log /app/logs/access-${time}.log main;
error_log /app/logs/error.log;
}
直接在nginx配置文件中,配置日志循环,但是会降低性能
也可以使用Perl语法来捕获,如下:
if ($time_iso8601 ~ "^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})") {}
access_log /data/logs/nginx/www.ttlsa.com-$year-$month-$day-access.log;
方法二:
利用crontab定时任务切割日志
1、vi /home/nginx/sbin/logcut.sh
日志切割脚本如下:
#!/bin/bash
LOGDIR="/home/master/logs/nginx/"
MONTH=$(date "+%Y-%m")
DAY=$(date "+%Y-%m-%d")
mkdir -p ${LOGDIR}/${MONTH}/
mv ${LOGDIR}/agvservice_7014_access.log ${LOGDIR}/${MONTH}/access-${DAY}.log
# 给nginx一个信号 重新打开日志文件
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
2、加入crontab任务
1 输入命令:crontab -e
2 加上命令:0 0 * * * sh /home/nginx/sbin/logcut.sh
# 第一个* 一小时当中的第几分钟:0-59
# 第二个* 一天当中的第几个小时:0-23
# 第三个* 一月当中的第几天:1-31
# 第四个* 一年当中的第几个月:1-12
# 第五个* 一周当中的第几个星期:0-7 0,7都代表周日
二、uwsgi分割
1、需要在uwsgi的配置文件中,添加 touch-logreopen,内容如下:
#设置一个日志监听对象
touch-logreopen = /logs/.touchforlogrotat
当监听对象 touch-logreopen 所指向的文件被touch,时间戳改变后,uwsgi会重新打开uwsgi.log文件进行写入,且不会中断当前程序的执行。如果没有touch-logreopen这个监听对象,是无法对uwsgi.log进行转储的。
2、脚本的内容 logbackups.sh 如下:
#!/bin/bash
# 日志所在目录
LOGDIR="/home/master/logs/nginx/smhprj/agvprj/"
DATE=$(date "+%Y-%m-%d")
#将旧日志重新以日期命名
mv ${LOGDIR}/uwsgi-today.log ${LOGDIR}/uwsgi-${DATE}.log
touch ${LOGDIR}/.touchforlogrotat
3、加入crontab任务
1 输入命令:crontab -e
2 加上命令:0 0 * * * sh /home/xxxx/logcut.sh
# 第一个* 一小时当中的第几分钟:0-59
# 第二个* 一天当中的第几个小时:0-23
# 第三个* 一月当中的第几天:1-31
# 第四个* 一年当中的第几个月:1-12
# 第五个* 一周当中的第几个星期:0-7 0,7都代表周日