shell脚本切割nginx日志

nginx是web中使用最广泛的服务器程序之一,但是nginx的日志这块是有些在实际生产环境中不太爽的地方!今天我要说下nginx log切割方法之一,后续可能会讲到log rotate的方式来做。

为什么要切割日志?

Nginx安装好后有些人会打开日志记录,有些人会关闭日志记录,打开日志记录后,nginx默认会把所有请求记录存放到一个文件中 access.log,这样日积月累所有网站的访问记录就会把日志文件越积越大,当需要查看日志文件的时候一看就是一大串,不方便查找。另外,也会影响到nginx的效率,因为日志写入是非常频繁的操作,打开一个大文件句柄的io成本肯定远远高于打开一个小的文件。

因此切割日志是非常有必要性的。

如何切割日志

先看一段shell代码

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh

#日志分割shell

logs_path="/jacoob/servers/nginx/logs/"

mv ${logs_path}access.log ${logs_path}access_$(date +"%Y%m%d").log

/jacoob/servers/nginx/sbin/nginx -s reopen

# 删除60天前的access_log
find ${logs_path} -mtime +60 -type f -name '*.log' -exec rm -f {} \;

下面逐行解释下

第一行 定义 log 存放的路径。

第二行 将log目录下的access.log重命名为 access_年月日.log eg access_20171228.log。

第三行 调用nginx -s reopen 用来打开日志文件,这样nginx会把新日志信息写入这个新的文件中。

第四行 删除60天前的access.log文件。

这样完成了日志的切割工作, 同时切割过程中没有日志的丢失。

shell脚本添加到crontab

crontab是服务器上的定时任务管理工具,写好上面的切割脚本后,需要定时执行。
使用命令

1
2
3
crontab -e 
# 进入到编辑状态,添加如下
59 23 * * * /jaccob/log_split.sh > /jacoob/log_split.error.log 2>&1 &

以上定义了一个每天23:59分执行的一个定时切割任务!

ok,这是shell脚本切割的一种方式,后面有空会写下利用logrotate切割日志。