crontab工具实现Nginx自动分割日志

利用crontab实现nginx日志按日期保存


情景

nginx日志默认保存到access.log 和error.log中,每个请求和错误都会被记录下来,但访问量大或时间久了,日志文件将会
非常大,分析日志将十分困难。因此是否有种简单的方法可以实现日志按日期输出呢?linux自带了一个可以定时执行的工具
crontab可以帮助我们轻松实现这个功能。

环境

本案例中nginx保存日志的目录如下:
access.lg 和 error.log 是默认的日志保存位置,log-history 文件夹保存历史日志,格式为: 日期-日志类型.log

├── log
│ ├── access.log
│ ├── error.log
│ └── log-history
│ ├── 20190603-access.log
│ ├── 20190603-error.log
│ └── newlog.sh

实现方法

1.编写newlog.sh
newlog.log 主要功能是将今天的日志剪切到log-history下的一个特定名字的文件下,然后重新加载配置。
需要使用这个脚本时字需要改变logroot的值计科。

#!/bin/bash
logroot="/home/ubuntu/Nginx/log"
hisroot=$logroot/log-history
day=$(date '+%Y%m%d')
aclogname="${day}-access.log"
erlogname="${day}-error.log"
cat $logroot/access.log > $hisroot/$aclogname
cat $logroot/error.log > $hisroot/$erlogname
sudo rm $logroot/access.log
sudo rm $logroot/error.log
sudo nginx -s reload

2.设置定时任务
#设置定时任务

$ crontab -e

#在打开的编辑器中输入以下内容,创建一个任务,每天结束前的一分钟执行newlog脚本

59 23 * * * /home/ubuntu/Nginx/log/log-history/newlog.sh

(然后:wq保存即可,不需要手动刷新)


分析

crontab是用来定期执行程序的命令。
常用语法:crontab { -l | -r | -e } (-l: 列出任务列表, -r 删除已有任务, -e 创建或编辑任务)
在输入crontab -e 后将进入时程表的编辑界面,每一行代表一个任务。
时程表的格式: min hour day_of_month month day_of_week , *常表示全部,其他语法还有n-m, */n, a,b,c
详情不作介绍。

过程中遇到的坑
1.若任务是定时执行脚本,请不要用./shell.sh的写法
2.请用绝对路径
3.偶尔发现日程表好难编辑,其实很可能是编辑器选择不对的原因。这是可以输入命令 select-editor, 选择vim, 再重新编辑即可。

你可能感兴趣的:(Nginx,Linux)