设为首页 收藏本站
查看: 792|回复: 0

[经验分享] logrotate轮询nginx日志

[复制链接]
发表于 2018-11-14 08:53:09 | 显示全部楼层 |阅读模式
  Linux日志文件如果不定期清理,会填满整个磁盘。这样会很危险,因此日志管理是系统管理员日常工作之一。我们可以使用”logrotate”来管理linux日志文件,它可以实现日志的自动滚动,日志归档等功能。下面以nginx日志文件来讲解下logrotate的用法。
  在/etc/logrotate.d/目录下创建一个配置文件”nginx”,内容如下:
#vim /etc/logrotate.d/nginx/usr/local/nginx/logs/*.log {  
daily
  
rotate 5
  
missingok
  
dateext
  
compress
  
notifempty
  
sharedscripts
  
postrotate
  
    [ -e /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` ]
  
endscript
  
}
  注释:
  /usr/local/nginx/logs/*.log:需要轮询日志路径
  daily:每天轮询
  rotate 5:保留最多5次滚动的日志
  missingok:如果日志丢失,不报错继续滚动下一个日志
  dateext:使用日期作为命名格式
  compress:通过gzip压缩转储以后的日志
  notifempty:当日志为空时不进行滚动
  /var/run/nginx.pid: nginx pid位置,请查看nginx.conf
  postrotate/endscript:在截断转储以后需要执行的命令
  立即截断可执行下面
/usr/sbin/logrotate -f /etc/logrotate.d/nginx  注:
  由于logratate已经加到cron.daily(/etc/cron.daily/logrotate),不再需要加到计划任务中
ogrotate的演示
  按天保存一周的Nginx日志压缩文件,配置文件为「/etc/logrotate.d/nginx」:
/usr/local/nginx/logs/*.log {  
    daily
  
    dateext
  
    compress
  
    rotate 7
  
    sharedscripts
  
    postrotate
  
        kill -USR1 `cat /var/run/nginx.pid`
  
    endscript
  
}
  如果你等不及CRON,可以通过如下命令来手动执行:
shell> logrotate -f /etc/logrotate.d/nginx  当然,正式执行前最好通过Debug选项来验证一下,这对调试也很重要:
shell> logrotate -d -f /etc/logrotate.d/nginx  BTW:类似的还有Verbose选项,这里就不多说了。
Logrotate的疑问
  问题:sharedscripts的作用是什么?
  大家可能注意到了,我在前面Nginx的例子里声明日志文件的时候用了星号通配符,也就是说这里可能涉及多个日志文件,比如:access.log和error.log。说到这里大家或许就明白了,sharedscripts的作用是在所有的日志文件都轮转完毕后统一执行一次脚本。如果没有配置这条指令,那么每个日志文件轮转完毕后都会执行一次脚本。
  问题:rotate和maxage的区别是什么?
  它们都是用来控制保存多少日志文件的,区别在于rotate是以个数为单位的,而maxage是以天数为单位的。如果我们是以按天来轮转日志,那么二者的差别就不大了。
  问题:为什么生成日志的时间是凌晨四五点?
  前面我们说过,Logrotate是基于CRON运行的,所以这个时间是由CRON控制的,具体可以查询CRON的配置文件「/etc/crontab」,可以手动改成如23:59等时间执行:
SHELL=/bin/bash  
PATH=/sbin:/bin:/usr/sbin:/usr/bin
  
MAILTO=root
  
HOME=/
  

  
# run-parts
  
01 * * * * root run-parts /etc/cron.hourly
  
59 23 * * * root run-parts /etc/cron.daily
  
22 4 * * 0 root run-parts /etc/cron.weekly
  
42 4 1 * * root run-parts /etc/cron.monthly
  如果使用的是新版CentOS,那么配置文件为:/etc/anacrontab。
  问题:如何告诉应用程序重新打开日志文件?
  以Nginx为例,是通过postrotate指令发送USR1信号来通知Nginx重新打开日志文件的。但是其他的应用程序不一定遵循这样的约定,比如说MySQL是通过flush-logs来重新打开日志文件的。更有甚者,有些应用程序就压根没有提供类似的方法,此时如果想重新打开日志文件,就必须重启服务,但为了高可用性,这往往不能接受。还好Logrotate提供了一个名为copytruncate的指令,此方法采用的是先拷贝再清空的方式,整个过程中日志文件的操作句柄没有发生改变,所以不需要通知应用程序重新打开日志文件,但是需要注意的是,在拷贝和清空之间有一个时间差,所以可能会丢失部分日志数据。
  BTW:MySQL本身在support-files目录已经包含了一个名为mysql-log-rotate的脚本,不过它比较简单,更详细的日志轮转详见「Rotating MySQL Slow Logs Safely」。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-634786-1-1.html 上篇帖子: 通过zabbix 3.4 实现nginx web监控 下篇帖子: nginx防止爬虫
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表