Nginx 默认不采用日志切片进行日志保存,这样就有一个弊端:日志文件都放在同一个文件中,长时间运行后日志文件很大,可能达到几个G,甚至十几个G大小,查看起来很不方便。为了解决这个问题就需要进行日志切片,如每小时或者每天的日志放在一个单独的文件中。怎么实现呢?windows 系统可通过简单的配置实现按日期存储,linux 的总体思路是:设置一个定时任务,每隔一段时间将日志文件备份后,告诉nginx 重新打开日志文件。
一、windows 按日期日志切片
server {
.......
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
}
access_log logs/$year-$month-$day-access.log;
......
}
二、linux 日志切片
1、新建shell脚本:
vi /opt/nginx/nginx_log.sh
#!/bin/bash
## 零点执行该脚本
## nginx.pid所在目录
declare PID_PATH="/usr/local/nginx/logs/nginx.pid"
## Nginx 日志文件所在的目录
declare LOGS_PATH="/usr/local/nginx/logs"
## 获取昨天的 yyyy-MM-dd
declare YESTERDAY=$(date -d last-day +%Y%m%d)
## 删除7天之前的日志
rm -rf ${LOGS_PATH}/access_$(date -d "7 days ago" "+%Y%m%d").log
## 执行mv操作
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
## 向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件
kill -USR1 `cat ${PID_PATH}`
2、授权执行 chmod 777 nginx_log.sh
3、./ nginx_log.sh 执行脚本若提示如下
原因可能是 文件的格式是dos,修改为unix,具体操作步骤如下
- 查看文件格式 用vim 打开出错的文件 按 ESC键 再按shift+冒号 输入 set ff 回车 可以看见 该文件的格式 fileformat=dos
- 按shift + 冒号 输入 set ff=unix 回车 发现没反应,那就对了。
- 可以按 shift + 冒号 set ff 查看 fileformat=unix
4、创建定时任务执行,执行命令crontab -e添加如下作业(每天凌晨执行)
0 0 * * * ./opt/nginx/nginx_log.sh