Nginx日志轮转及Logrotate自定义日志轮转

2023-05-16

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

    //就是运行计划任务的解释器,默认是bash
    SHELL=/bin/sh
    //执行命令的环境变量
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    //计划任务的出发者用户
    MAILTO=root
    //表示anacron在执行任务前先延时一段随机的时间再执行,这段随机的时间为0-45分钟之内的随机数。
    RANDOM_DELAY=45      
    //指定了只有在凌晨3点到晚上22点这个时间段内才允许执行任务
    START_HOURS_RANGE=3-22

    1   5   cron.daily      nice run-parts /etc/cron.daily

    7   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/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  //每天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.conf

EXITVALUE=$?

if [ $EXITVALUE != 0 ]; then

    /usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]"

fi

exit 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查看

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx日志轮转及Logrotate自定义日志轮转 的相关文章

随机推荐