本文主要是介绍Nginx日志轮转及Logrotate自定义日志轮转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
logrotate日志轮转
https://blog.csdn.net/qq_34777982/article/details/107938327
logrotate日志轮转方式create和copytruncate原理
https://blog.csdn.net/sinat_40658206/article/details/125237578
进程平滑重启
https://blog.csdn.net/yizhou35/article/details/103106225
crontab和anacron和logrotate的关系详解
https://blog.csdn.net/damiaomiao666/article/details/72597731
Linux-- 定时服务crond VS anacron和 crontab VS anacrontab区别对比
https://blog.csdn.net/JustinQin/article/details/119378255
Logrotate日志切割轮询
由于Logrotate是基于CRON运行的,所以这个日志轮转的时间是由CRON控制的,具体可以查询CRON的配置文件/etc/anacrontab,过往的老版本的文件为(/etc/crontab)
查看轮转文件:/etc/anacrontab
cat /etc/anacrontab
//就是运行计划任务的解释器,默认是bashSHELL=/bin/sh//执行命令的环境变量PATH=/sbin:/bin:/usr/sbin:/usr/bin//计划任务的出发者用户MAILTO=root//表示anacron在执行任务前先延时一段随机的时间再执行,这段随机的时间为0-45分钟之内的随机数。RANDOM_DELAY=45 //指定了只有在凌晨3点到晚上22点这个时间段内才允许执行任务START_HOURS_RANGE=3-221 5 cron.daily nice run-parts /etc/cron.daily7 25 cron.weekly nice run-parts/etc/cron.weekly@monthly 45 cron.monthly nice run-parts/etc/cron.monthly
使用anacrontab轮转的配置文件,日志切割的生效时间是在凌晨3点到22点之间,而且随机延迟时间是45分钟,但是这样配置无法满足我们在现实中的应用
现在的需求是将切割时间调整到每天的晚上12点,即每天切割的日志是前一天的0-24点之间的内容,操作如下:
mv /etc/anacrontab /etc/anacrontab.bak //取消日志自动轮转的设置
使用crontab来作为日志轮转的触发容器来修改Logrotate默认执行时间
vi /etc/crontab
SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/ # run-parts01 * * * * root run-parts /etc/cron.hourly //每个小时一分钟时执行59 23 * * * root run-parts /etc/cron.daily //每天23时59分执行一次22 4 * * 0 root run-parts /etc/cron.weekly //每周日4时22分执行一次42 4 1 * * root run-parts /etc/cron.monthly //每个月第一天的4时42分执行一次
第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59
第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。
第六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;
第七段应该定义的是:执行的命令和参数。
解决logrotate无法自动轮询日志的办法
现象说明:
使用logrotate轮询nginx日志,配置好之后,发现nginx日志连续两天没被切割,检查后确定配置文件一切正常,这是为什么呢?
强行启动记录文件维护操作,纵使logrotate指令认为没有需要,应该有可能是logroate认为nginx日志太小,不进行轮询。
故需要强制轮询,即在/etc/cron.daily/logrotate脚本中将 -t 参数替换成 -f 参数
vim /etc/cron.daily/logrotate
#!/bin/sh/usr/sbin/logrotate /etc/logrotate.confEXITVALUE=$?if [ $EXITVALUE != 0 ]; then/usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]"fiexit 0
最后最后重启下cron服务:
/etc/init.d/crond restart 或者 service crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]
服务器上的nginx使用logrotate来分割日志整个流程
crond服务加载 /etc/cron.d/0hourly —> 在每小时的01分执行/etc/cront.hourly/0anacron —>执行anacron —>根据/etc/anacrontab的配置执行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly —>执行/etc/cron.daily/下的logrotate脚本 —>执行logrotate —>根据/etc/logrotate.conf配置执行脚本/etc/logrotate.d/nginx —>分割nginx日志成功
logrotate自定义日志轮转
因为anacrontab中定义的定时任务是3-22时执行且有时间延迟,如果想每天的0点让nginx进行日志轮转可以自己配置
首先,将/etc/logrotate.d/nginx文件删掉,以免进行重复轮转
其次,定义新的存放路径 /etc/logrotate.daily/nginx
然后,定时任务执行命令
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.daily/nginx. 每天0点0分执行
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.daily/nginx. 每天23点59分执行
如果crontab中定义的执行时间是0点,则需要在/etc/logrotate.d/nginx/nginxLogrotate里添加上dateyesterday这个选项,否则日志内容记录的是昨天的,而 日志名称格式却是今天的,但crontab中定义的执行时间是23:59这样的则不用添加dateyesterday选项
方法一
crontab -e
编辑完以后会保存到/var/spool/cron/root文件中
方法二
vi /etc/crontab
编辑时一定要指明用户,否则不生效
0 0 * * * root /usr/sbin/logrotate -f /etc/logrotate.daily/nginx
如果服务器都是有root来管理,建议添加crontab使用方法2,这样系统中的所有计划任务都在一起,一目了然。
注意:这里面需要指定用户名;而方法1中则不需要,如果指定了,它会认为是命令的一部分,从而可能导致crontab执行失败。
测试是否生效
/usr/sbin/logrotate -vfd /etc/logrotate.daily/nginx # 以debug测试是否生效,不会真的切割日志
/usr/sbin/logrotate -fv /etc/logrotate.daily/nginx # 强制生效并显示详细的输出信息
详细信息请用man logrotate查看
这篇关于Nginx日志轮转及Logrotate自定义日志轮转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!