一. 前提背景及需求
nginx运行日志默认保存在nginx安装目录下的 /usr/local/nginx/logs 文件夹, 包含access.log和error.log两个文件.
(1) access.log 记录了哪些用户、哪些页面以及用户浏览器、ip和其他的访问信息;
(2) error.log 则是记录服务器错误日志.
在所有时间内nginx产生的日志均保存在同一个文件下, 随着访问量的增加,尤其是access.log增长极快,服务器会很快消耗磁盘空间,影响服务器效率。
另外,当需要对日志文件里面记录的数据进行分析时,每次都要耗时很久才能下载这个庞大的日志文件,浪费不必要的时间。
因此急需一个处理方案能够自动化的实现按天或者按文件大小来切割nginx日志记录.
二. 解决方案: 使用logrotate工具实现日志切割
1. logrotate工具的介绍
logrotate是一个 linux系统日志的管理工具。可以对单个日志文件或者某个目录下的文件 按时间/大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令。
logrotate是基于 crontab运行的,所以这个时间点是由 crontab控制的,具体可以查询crontab的配置文件/etc/anacrontab。 系统会按照计划的频率运行logrotate,通常是每天。在大多数的Linux发行版本上,计划每天运行的脚本位于 /etc/cron.daily/logrotate。
主流Linux发行版上都 默认安装有logrotate包,如果你的linux系统中找不到logrotate, 可以使用apt-get或yum命令来安装。
接下来,我们查看logrotate的配置文件
使用指令:rpm -ql logrotate
由下图可知,logrotate的配置文件是 /etc/logrotate.conf, 这个文件用来定义全局默认参数。
其中, /etc/logrotate.d/ 是用于存储各种自定义应用的配置文件的目录。该目录里的所有文件都会被主动的读入到 /etc/logrotate.conf中执行。该目录下的应用配置文件继承所有/etc/logrotate.conf 的默认参数。
因此我们可以新建一个针对nginx日志文件的轮循配置的文件,然后将这个文件放在 /etc/logrotate.d/ 目录下, 它就会主动的读入到/etc/logrotate.conf中执行, 以达到按指定频率定时执行的需求。
2. 创建nginx日志分割文件 (路径: /etc/logrotate.d/nginx )
新建nginx文件, 存放在/etc/logrotate.d/ 文件夹下, 内容如下
/usr/local/nginx/logs/access.log {
daily
rotate 7
missingok
dateext
compress
delaycompress
notifempty
sharedscripts
postrotate
[ -e /usr/local/nginx/logs/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
endscript
}
3. 运行logrotate
使用指令: logrotate/etc/logrotate.d/nginx
测试日志切割 (如果文件的时间小于一天,不会执行切割日志 )
使用指令: logrotate -d /etc/logrotate.d/nginx
强制轮询切割日志 ( 为了便于我们直观的观察测试结果,建议大家手动试一下 )
使用指令: logrotate -vf /etc/logrotate.d/nginx
至此, 我们使用logrotate配置的nginx日志切割功能已经实现了, 它会按照设定的频率定时的执行下去,最后附加一张示例图----nginx切割后的日志目录:
附: 报错处理
原因: 需要将我们的/etc/logrotate.d/nginx 将dos格式文本转化为unix格式
解决方案: 参考 Convert CRLF's to line feeds on Linux
1. 第一步, 安装dos2unix, 指令为: yum install dos2unix
2. 第二步, 执行转换, 指令为: dos2unix /etc/logrotate.d/nginx
福利: 本文已同步到我的个人技术网站 IT干货-sufaith 该网站包括Python, Linux, Nodejs, 前端开发等模块, 专注于程序开发中的技术、经验总结与分享, 欢迎访问.