技术分享 其他 查看内容

Nginx 日志文件切割

老高 | 发布于 2017-07-28 08:47| 浏览()| 评论() | 收藏() | 点赞() | 打印

摘要: Nginx 是一个非常轻量的 Web 服务器,体积小、性能高、速度快等诸多优点。

Nginx 是一个非常轻量的 Web 服务器,体积小、性能高、速度快等诸多优点。但不足的是也存在缺点,比如其产生的访问日志文件一直就是一个,不会自动地进行切割,如果访问量很大的话,将 导致日志文件容量非常大,不便于管理。当然了,我们也不希望看到这么庞大的一个访问日志文件,那需要手动对这个文件进行切割。

在 Linux 平台上 Shell 脚本丰富,使用 Shell 脚本加 crontab 命令能非常方便地进行切割,但在 Windows 平台上就麻烦一些了,刚才弄了好长时间,就在这里记录整理一下。

日志文件切割要求

由于 Nginx 的日志都是写在一个文件当中的,因此,我们需要每天零点将前一天的日志存为另外一个文件,这里我们就将 Nginx 位于 logs 目录中的 access.log 存为 access.[yyyy-MM-dd].log 的文件。其实 logs 目录中还有个 error.log 的错误日志文件,这个文件也需要每天切割一个,在这里就说 access.log 了,error.log 的切割方法类似。

Linux 平台切割

在 Linux 平台上进行切割,需要使用 date 命令以获得昨天的日期、使用 kill 命令向 Nginx 进程发送重新打开日志文件的信号,以及 crontab 设置执行任务周期。

先创建一个 Shell 脚本,如下:

#!/bin/bash

DAYS=30

#设置日志文件存放目录  
log_path="/usr/local/nginx/logs" 

yesterday=$(date -d "yesterday" +%Y-%m-%d)

#设置pid文件  
pid_path="/usr/local/nginx/logs/nginx.pid"  

#重命名日志文件  
mv ${log_path}/access.log ${log_path}/access.${yesterday}.log 
mv ${log_path}/error.log ${log_path}/error.${yesterday}.log 

#向nginx主进程发信号重新打开日志  
kill -USR1 `cat ${pid_path}` 

#删除30天以前的日志
find ${log_path} -name "access*.log" -type f -mtime +$DAYS -exec rm {} \;
find ${log_path} -name "error*.log" -type f -mtime +$DAYS -exec rm {} \;

上面这个脚本中必须向 Nginx 的进程发送 USR1 信号以重新打开日志文件,如果不写的话,Nginx 会继续将日志信息写入 access.[yyyy-MM-dd].log 的那个文件中,这显然是不正确的。

脚本完成后将其存入 Nginx 安装目录的 logs 中,取名为 nginx_cut_log.sh,之后使用 crontab -e 新增一个定时任务,在其中增加执行这个脚本:

0 0 * * * /usr/local/nginx/logs/nginx_cut_log.sh

添加nginx_cut_log.sh的执行权限

chmod 777 nginx_cut_log.sh

查看定时任务执行日志

tail -f /var/log/cron

到这里 Linux 下切割 Nginx 日志就完成了,可以将 crontab 设置为距当前时较近的时间测试一下,否则在零点出问题就不好了 

注意避免开启多个cron进程!执行 “ps -A | grep cron”,只需保留一个进程

发表评论(对文章涉及的知识点还有疑问,可以在这里留言,老高看到后会及时回复的。)

表情