#nginx

为什么想写日志切分,因为一直我好像没有研究过它如何实现,至于如何实现,的确也有多种方法,先写nginx官方推荐的吧。

Nginx官方推荐的日志切分方式


Log Rotation:官方推荐的日志切分实现

1
2
3
4
$ mv access.log access.log.0
$ kill -USR1 `cat master.nginx.pid`
$ sleep 1
$ gzip access.log.0 # do something with access.log.0

原理如下

  1. 将access.log重命名为access.log.0,由于linux都采取文件描述符来读取文件,因此重命名文件后日志还将持续的向原文件写入
  2. USER1是linux中自定义的信号机制,nginx在收到该信号时会重新读取配置文件
  3. sleep 1秒能确保nginx将之前的旧日志文件能够彻底的关闭

具体实现


设想如果要定时的切分日志,那需要一个定时任务,来定时的对日志文件重命名并且引导nginx写入新的文件,而另一个shell脚本用来做具体的日志切割实现

定时任务

如何实现定时任务,有多种多样的solution,为了简单,我就使用mac上的crontab吧, crontab -e添加一行

1
2
#每一分钟切割一次日志
*/1 * * * * sh ~/logrotation.sh

日志切割脚本

1
2
3
4
5
6
7
#! /bin/sh
time=`date +%Y%m%d%H%m`
mv access.log access.log.${time}

## 获取nginx的pid,没找到pid文件,就偷懒了
kill -USR1 `ps -ef | grep nginx | grep master |awk '{print $2}'`
sleep 1

执行结果

1
2
baidudeMacBook-Pro:log echo$ ls
access.log access.log.201709172136 access.log.201709172137

如上图所示,日志切分成功。


扩展阅读

5个使用Redis时需要注意的事项:对于Redis的使用和建议改了一些比较中肯的建议,很实用。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×