深入了解Linux日志分割工具 - logrotate

发布时间 2023-11-30 10:46:28作者: 冰块好冰

深入了解Linux日志分割工具 - logrotate

介绍

在 Linux 系统中,日志文件是了解系统运行状态、应用程序活动以及故障排查的关键。然而,随着时间的推移,日志文件可能会变得庞大,占用过多磁盘空间。为了解决这个问题,Linux 引入了一个强大的日志管理工具 - logrotate。

logrotate 并非仅仅是一个配置文件,它是一个日志轮换系统,通过周期性地轮换、压缩和删除日志文件,保持系统日志的健康,并防止磁盘空间的不合理使用。

原理分析

logrotate​ 通常由系统的调度任务(如 cron​)定期触发。在运行时,logrotate​ 会读取配置文件,主要是 /etc/logrotate.conf​ 和 /etc/logrotate.d/​ 目录下的配置文件。这些配置文件定义了轮换规则、条件和操作。logrotate​ 检查每个配置文件中定义的日志文件,根据配置的条件(例如文件大小、时间间隔等)判断是否需要进行轮换。如果某个日志文件符合轮换条件,logrotate​ 将执行相应的轮换操作。这通常包括创建新的空日志文件、截断或压缩原始日志文件,以及可能的其他操作。logrotate​ 记录轮换的操作和结果,这些信息可以在系统的日志文件中查看,例如 /var/log/logrotate.log​。

轮换模式

create​(新建模式,默认)/ copytruncate​(复制模式)

create​:先把当前使用的日志文件重命名(存档),再创建一个新的日志文件继续记录;

copytruncate​:一直使用当前的日志文件,每次滚动时将历史信息剪切到一个新的日志文件中(存档),使得当前的日志文件只保留最新的日志信息。

这两种模式是互斥的,主要区别就是对当前日志的切换处理,第一种需要切换到新的日志文件继续写入,第二种一直在向同一个日志文件写入,因此不涉及切换日志的问题。

性能方面,如果每天生成的日志非常大,那么肯定第一种性能更好,否则影响不大。

可靠性方面,由于复制模式在实际操作时有丢失部分数据的风险,因此应优先使用默认的 create 模式。

基本使用

Logrotate 的基本使用需要编辑其配置文件,该文件通常位于 /etc/logrotate.conf​。此外,还可以在 /etc/logrotate.d/​ 目录下创建单独的配置文件。以下是一个基本配置文件的示例:

# /etc/logrotate.conf

/var/log/myapp.log {
    rotate 7
    daily
    compress
    missingok
    notifempty
	postrotate
    	/path/to/command
	endscript
}

配置参数解释

compress​:启用日志文件的压缩,使用 gzip 压缩。

missingok​:如果日志文件不存在,则忽略,而不是生成错误。

notifempty​:如果日志文件为空,则不轮换。

daily/weekly/monthly​:定义轮换的频率,可以选择每天、每周或每月

rotate​:保留多少个轮换后的日志文件

create​:在轮换时创建一个新的空日志文件

copytruncate​:在轮换时将原始日志文件截断而不是重命名,适用于不支持文件重命名的应用程序。

postrotateendscript​:定义在轮换后执行的命令,用于附加操作,如重启服务。

size​:指定在何时触发轮换,基于日志文件的大小。

maxsize​:设置日志文件的最大大小,超过则触发轮换。

常用的命令

测试配置,不做实际操作。

logrotate -d /etc/logrotate.d/tomcat

手动执行 logrotate

logrotate -vf /etc/logrotate.d/tomcat

查看 cron 日志,确定 logrotate 是否执行

tail /var/log/cron

查看 logrotate 的状态文件,确定是否执行了具体切割任务

cat /var/lib/logrotate/logrotate.status
# 如果存在指定的切割任务,说明执行成功,比如:
"/mnt/logs/nginx/access.log" 2022-4-28-3:35:1
"/mnt/logs/nginx/error.log" 2022-4-28-3:35:1