热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jstack脚本自动日志_运维老司机又翻车,居然没用过日志切割Logrotate

运维老司机又翻车,居然没用过日志切割Logrotate作为一个运维老司机,这次又翻车了。只能说明一个原因,就是菜,所有才要多

运维老司机又翻车, 居然没用过日志切割Logrotate

作为一个运维老司机, 这次又翻车了。只能说明一个原因, 就是菜, 所有才要多学习。

说起日志切割, 自己可以说是溜的一批。基本的套路就是在crontab中写一个定时任务,脚本去切割日志文件

纵观所有日志切割的方法, 都和linux中crontab脚本定时执行编写好的日志切割脚本, 其本质就是相同的

其实Logrotate也是默认使用了linux系统中的crontab, 并且使用的比较高级而已, 所以老司机就翻车了。那这个大型翻车现场, 凌神要复盘一下啊, 更好的走好接下来的路。

1. logrotate介绍

logrotate是linux系统自带的一个日志切割利器, 使用者只需要指定日志名称, 切割规则, 其他的你就瞧好吧, linux服务器肯定把你伺候的服服帖帖。 享五星超值服务。

logrotate是基于crond服务来运行的,其crond服务的脚本是/etc/cron.daily/logrotate,日志转储是系统自动完成的。

实际运行时,logrotate会调用主配置文件 /etc/logrotate.conf,可以在 /etc/logrotate.d 目录里放置自定义好的配置文件(及你需要切割的日志名字和切割规则),用来覆盖logrotate的缺省值。

定时执行/etc/cron.daily目录下的文件的设置,则在/etc/anacrontab里定义的,那anacrontab怎么知道上次成功执行脚本的具体时间呢?后面说详细剖析。凌神出马了, 就给你掰扯明白了。

通过查看/etc/cron.daily/logrotate得知有 /var/lib/logrotate/logrotate.status这样的一个文件,此文件的作用就是记录最近一次成功运行日志分割脚本的具体时间.

所以logrotate执行脚本的命令其实是/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf。

2. logrotate执行流程

  • crond服务加载/etc/cron.d/0hourly --->

  • 在每小时的01分执行/etc/cron.hourly/0anacron --->

  • 执行anacron --->

  • 根据/etc/cron.daily/logrotate获得上次运行logrotate的时间 --->

  • 根据/etc/anacrontab的配置执行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly --->

  • 执行/etc/cron.daily/下的logrotate脚本 --->

  • 执行logrotate --->

  • 根据/etc/logrotate.conf配置执行脚本/etc/logrotate.d/nginx --->

  • 转储nginx日志成功

3. logrotate使用

1. 示例

在/etc/logrotate.d/下面新建文件nginxLogrotate

vim /etc/logrotate.d/nginxLogrotate

添加如下:

/home/APPDeploy/nginx-1.16.0/logs/*.log { #日志文件所在的路径
daily #每天进行日志分割
missingok #在日志转储期间,任何错误将被忽略
rotate 30 #保留30个备份
compress #通过gzip压缩转储以后的日志
delaycompress #delaycompress和compress一起使用时,转储的日志文件到下一次转储时才压缩,即这次切割的日志不压缩
dateext #日志后面带时间,如:nginx.access.log-20190516
#dateformat -%Y%m%d%s #日志时间格式
#dateyesterday #如果定时任务时间设置的是0点就要配置此项,不然切割的内容是昨天的但是日志名却是当天的.
notifempty #当日志文件为空时,不进行轮转
create 644 APPDeploy APPDeploy #轮转时指定创建新文件的属性
sharedscripts #运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
postrotate #在logrotate转储之后需要执行的指令,下面的脚本作用是让nginx将日志内容存储在新的日志文件中.
if [ -f /home/APPDeploy/nginx-1.16.0/run/nginx.pid ]; then
kill -USR1 `cat /home/APPDeploy/nginx-1.16.0/run/nginx.pid`
fi
endscript
}

  • 测试是否生效

2. 配置文件说明

配置参数说明
monthly日志文件将按月轮循。其它可用值为'daily','weekly'或者'yearly'。
rotate 5一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。
compress在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
delaycompress总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
missingok在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
notifempty如果日志文件为空,轮循不会进行。
create 644 root root以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
postrotate/endscript在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。
以上信息来源 "man logrotate"

3. 手动运行logrotate

logrotate可以在任何时候从命令行手动调用。要调用为/etc/lograte.d/下配置的所有日志调用logrotate:

[root@clsn6 ~]# logrotate /etc/logrotate.conf

要为某个特定的配置调用logrotate,执行一次切割任务测试:

logrotate -vfd /etc/logrotate.d/nginxAccessLog # 以debug测试是否生效,不会真的切割日志

logrotate -fv /etc/logrotate.d/nginxAccessLog # 强制生效并显示详细的输出信息

详细信息请用man logrotate查看

即使轮循条件没有满足,我们也可以通过使用‘-f’选项来强制logrotate轮循日志文件,‘-v’参数提供了详细的输出。

4. logrotate的生效时间

要想知道logrotate什么时候执行日志分割操作,需要关注/etc/anacrontab/var/lib/logrotate/logrotate.status这两个文件.

上文中已介绍过/var/lib/logrotate/logrotate.status这里就不在赘述了.

/etc/anacrontab是使logrotate按时执行脚本的主要配置文件,我们来仔细看下anacrontab的主要内容:

sudo cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=03-22

#period in days delay in minutes job-identifier command
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

从上面的内容可以看出:如果机器没有关机,默认的logrotate(配置文件里设置的是cron.daily)一般会在每天的3点05分到3点50分之间执行,真实的延迟时间是 RANDOM_DELAY + delay in minutes.

如果在3-22这个时间段内服务器处于关机状态,则logrotate会在机器开机5分钟后执行分割日志的操作.

注意

不建议直接修改此文件,如果想修改logrotate默认的执行时间,可通过crontab执行自定义的logrotate配置文件,但这时就不能将自定义的配置文件放置在 /etc/logrotat.d/下了,应该放置在/etc/logrotat.d/下层目录或者另外的路径,否则就会执行两遍日志分割的操作,执行时间分别是你在crontab中定义的时间以及anacrontab默认的执行时间即3:05-3:50。

5. 自定义logrotate执行时间

正常的日志分割都是按天进行的,即每个日志只记录0-24点之间的内容,如果是按默认的anacrontab设定的执行时间那肯定是不行的,下面看一下吧。

1: 在/etc/logrotate.d创建下层目录,mkdir -p /etc/logrotate.d/nginx ,当然也可在非/etc/logrotate.d/下创建此目录,例如我是在/etc/logrotate.daily.0下创建了nginxLogrotate文件.

2: 移除之前自定义的配置文件,sudo mv /etc/logrotate.d/nginxLogrotate ~/bak/,这样做的作用就是防止执行两次日志分割脚本的操作.

3: 添加crontab计划任务, sudo echo "59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.daily.0/nginxLogrotate >/dev/null 2>&1" > /etc/crontab

当然也可直接在root用户下执行crontab -e然后添加上面的内容.

如果用非root用户则会报错error: error creating output file /var/lib/logrotate/logrotate.status.tmp: 权限不够

4: 重启crontab,service crond restart,其实可以不用重启.

其实最后, 凌神掌握的还是最高逼格的自定义的contab, 想什么时候执行, 就什么执行, 想执行什么脚本, 自己写就好了, 更自由。

如果你已经知道或者了解过logrotate, 抓紧在下面的评论区碰凌神吧, (凌神这个菜狗......)

如果你没有学过, 凌神带你脱坑, 不香吗? 不值得点个赞吗?

697d86683f15ca54b9d30e6385884350.png
长的帅的都关注我
f63f688d398a9fb459e427aa986391a8.png
创作不易, 动手支持一下


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • centos php部署到nginx 404_NodeJS项目部署到阿里云ECS服务器全程详解
    本文转载自:http:www.kovli.com20170919ecs-deploy作者:Kovli本文详细介绍如何部署NodeJS项目到阿里云ECS上, ... [详细]
  • 对于一般的扩展包,我们一般直接pipinstallxxx即可安装,但是unrar直接安装后,发现并不能通过Python程序实现解压的功能& ... [详细]
  • 基于SSL的mysql服务器的主从架构实现说明:本文选用172.16.22.1作为主服务器,172.16.22.3作为从服务器从服务器的mysql软件版 ... [详细]
  • 一、设置时区方法一:使用setup工具setup选择Timezoneconfiguration选择AsiaShanghai空格键勾选上System ... [详细]
  • Linux学习笔记:psef、ps aux、kill9
    一、查看进程命令1.ps命令Linux中的ps命令是ProcessStatus的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就 ... [详细]
  • XTOOLS【运维平台】之本地&远程服务器磁盘容量校验(三)
    互联网爆炸时代,数据就是金钱,但过期数据如何有效定期压缩,为有效数据留下宝贵空间是很多业务遇到的问题。多数公司采用的方式如下:\x0a\x0ashell脚本以crontab的方式定 ... [详细]
  • CentOS下基于PPTPD与AD验证的×××服务器构建
    一.服务器加入AD域名1.安装kerberos、samba、ntpdateyum-yinstallkrb5-workstationpam_krb5krb5-develkrb5-li ... [详细]
  • 在做以下实验时需先做的操作为:(1)打开两个虚拟机(desktop和server)并更改他们的ipÿ ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
author-avatar
QQweiqiang_850
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有