目录
一、日志轮转工具的由来
二、如何去使用logrotate工具
2.1 使用cron驱动logrotate
2.2 使用systemd的timer驱动logrotate
三、logrotate命令的子命令解析
四、logrotate的配置
4.1 配置文件的位置
4.2 配置项的具体含义
一、日志轮转工具的由来
在Linux环境中能够帮助我们分析问题蛛丝马迹的有效办法之一便是日志,为了节省空间和方便整理,可以将日志文件按时间或大小分成多份,删除时间久远的日志文件,这就是通常说的日志滚动(log rotation)。
logrotate是由尤金·克里利(Eugene Eric Kim)发明的。尤金·克里利在1996年以自己的名义发布了这个工具,以解决当时在管理大量系统日志时遇到的问题。在那时,UNIX系统并不像现在这样有丰富的日志管理工具,因此logrotate的出现填补了这一空白。
在linux中日志通常是被syslog进行管理的在/var/log下就是我们的系统日志和一部分应用日志
/var/log/messages
:该文件包含了系统消息,如内核日志、系统守护进程日志等。/var/log/auth.log
:该文件包含了用户登录和验证相关的信息。/var/log/syslog
:该文件包含了系统所有的日志消息。/var/log/kern.log
:该文件包含了内核日志消息。/var/log/cron.log
:该文件包含了cron定时任务执行时的日志信息。/var/log/boot.log
:该文件包含了系统启动时的日志信息。/var/log/secure
:该文件包含了与安全相关的信息,如SSH登录尝试、SELinux相关的消息等。/var/log/maillog
:该文件包含了邮件系统的日志信息。
。。。。。。
上面仅仅是一部分实际上它可能是这样的
当然这里是已经被logrotate进行管理过的,可以看到他有很多的久日志被切分并压缩了。如果没有这个工具各种日志都要我们手动去切分压缩并且删掉久的,系统的容量和复杂度提升后这个工作甚至可能需要一个团队去管理,很大程度上的浪费了人力。
二、如何去使用logrotate工具
2.1 使用cron驱动logrotate
这是一个linux各大发行版几乎都内置了的工具,syslog进行日志收集、分类、定级、转存等,logrotate去对收集好的文件进行配置比对并执行设定程序。
在老版本的ubuntu中logrotate是使用cron进行管理的,需要什么样的粒度就在哪里配置,最大误差不超过45min。一般都是5min左右。
比如配置成一天轮转一次
这个脚本的主要工作流程是这样的:
- 切换到/var/lib/logrotate目录
- 如果status文件不存在,就创建一个新的status文件
- 从status文件中读取第一行,并将其写入到一个新的文件status.clean中
- 使用sed命令删除status文件中所有的双引号,然后遍历每一行,如果日志文件存在,就将日志文件名和日期写入到status.clean文件中
- 最后将status.clean文件重命名为status文件
- 检查/usr/sbin/logrotate是否存在并可执行,如果不是,就退出脚本
- 如果是,就执行/usr/sbin/logrotate /etc/logrotate.conf命令,按照/etc/logrotate.conf文件中的规则来管理日志文件
cron.d下就是cron本身的配置了同级还有哥crontab里面是对月日年的实现进行定义,在systrmd架构下cron有的是借助systemd的timer机制实现的,有的是两个都保留了。在不同的发行版中有所不同。具体的感觉不是很稳定随着systemd的成熟可能cron会废弃也不一定。但是一个是内核层的一个是系统层的。各种观点意见比较多。选择一个好用的就行。
2.2 使用systemd的timer驱动logrotate
既然都说到了systemd,那就来看看systemd是怎么配置的吧。
这里要说明一下ubuntu18.04用的是cron进行管理。
20.04版本是两个都用了。这个版本systemd的配置优先级高于cron,但是systemd默认不配置。
22.04用的是systemd就是我截图的样子。
20版本木有咋办没关系,直接手动创建这俩文件然后按照上面那样配置就行。
如果需要改时间的话改【timer】那里,如果粒度是小时就不需要配置1h那个子项了,timer的粒度好像是1秒。但是logrotate最小只能是1h而且不能配置子项意味着只能整点轮转。配置成天的话可以选择在一天的哪个时间轮转,也可以配置几天轮转一次更大粒度也可设置更多子项。
这个的机制其实就是定时器到时间了去执行logrotate这个可执行文件,并且按照我们的配置文件去执行。所以如果你想更快的话可以自己写进程到时间了去执行。但是其实这个工具的轮转和压缩耗时还是挺久的有些配置在文件超大的情况下耗时可能会高达分钟级别,这在嵌入式系统中绝对是不行的,会严重影响业务效率。这时候可以使用内核亲和性对进程排组划分使用核心。当然只有多核cpu可以这样,单核就木有办法啦,只能挺着。这里也有坑需要考虑多级缓存和多核心共用缓存的问题。比较麻烦。特殊项目特殊对待。学会基础知识,实际运用时还是要灵活多变的。
三、logrotate命令的子命令解析
logrotate命令用于对系统日志进行轮转、压缩和删除,也可以将日志发送到指定邮箱。它允许自动旋转、压缩、删除和邮寄日志文件,可以设置日志文件的保留周期,如每日、每周、每月处理,也能在文件太大时立即处理。每个日志文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。
使用logrotate指令时,必须自行编辑指定配置文件,预设的配置文件存放在/etc/logrotate.conf文件中。语法为logrotate(选项)(参数),常用选项包括:
-?
或--help
:在线帮助;-d
或--debug
:详细显示指令执行过程,便于排错或了解程序执行的情况;-f
或--force
:强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然;-s<状态文件>
或--state=<状态文件>
:使用指定的状态文件;-v
或--version
:显示指令执行过程;-usage
:显示指令基本用法。
-d时不会实际执行,-f时会不按照配置的那样即便你只有1个字节的日志也会轮转。
四、logrotate的配置
4.1 配置文件的位置
这里是整体的配置,一般在logrotate.d目录下还有针对各个程序的配置
系统日志一般被syslog管理,我们想要自定义一些服务最好也交给syslog可靠且方便
默认状态下主要是两类配置,系统日志和syslog本身的配置。其实这个种类是可以增加的,只要这类日志需要的管理方式一样就可以路径加具体配置的方式写入文件。当然也可以在logrotate.d目录下新建一个文件来专门管理你自己设置的日志规则。
4.2 配置项的具体含义
daily
,weekly
,monthly
, 或者yearly
: 这些关键词定义了日志文件的轮转周期。例如,daily
表示每天轮转一次,weekly
表示每周轮转一次,monthly
表示每月轮转一次,而yearly
则表示每年轮转一次。compress
: 这个关键词表示是否要压缩旧的日志文件。使用gzip或bzip2等压缩工具进行压缩。delaycompress
: 如果设置了这个参数则logrotate会延迟压缩上一次的日志文件,直到下一次的日志轮转。missingok
: 如果设置了泽哥参数则当logrotate试图处理的日志文件丢失时,它将不会产生错误消息。notifempty
: 如果设置了这个参数则当日志文件为空时,logrotate将不会进行轮转。olddir
: 这个指令定义了旧日志文件的存放位置。sharedscripts
: 如果设置为true,则所有的日志文件将使用相同的postrotate脚本。postrotate
: 这个指令定义了在日志文件轮转之后要执行的命令。prerotate
: 这个指令定义了在日志文件轮转之前要执行的命令。size
: 这个指令定义了日志文件的最大大小。当日志文件达到这个大小时,logrotate会进行轮转。create
: 这个指令定义了在处理日志文件之前要创建的新文件。dateext
: 如果设置这个参数则在轮转时,新的日志文件名将包含当前日期。- dateformat -%Y%m%d-%s这个参数要跟在上个参数后面表示日期的格式,目前最多支持年月日秒格式。
- mail address : 这个参数可以指定一个邮箱地址将轮转后的文件发送到指定邮箱。
- copytruncate:这个参数会在不改变inode的情况下完成轮转后面细说。
- create:指定创建文件的权限所有组和所有者。
这里有个要注意的点就是15这个参数,因为有些日志不支持输出至新inode所以只能保留原来的文件将之前日志文件复制一份出来。这就有个问题,在复制的过程中,如果日志的数量过高会丢失这段时间的日志。但是有些软件不支持所以推出了这个功能,如果不配置这个参数的话就是将原来的日志文件改个名字,新创建一个再去通知写日志的进程新的文件inode这样不会丢失文件。缺点是不是所有软件都支持向新inode写入日志。