⽇志轮替是指对系统中⽣成的⽇志⽂件进⾏周期性管理的过程。随着时间的推移⽇志⽂件会不断 增⻓最终可能占⽤⼤量磁盘空间。为了避免⽇志⽂件⽆限制增⻓并耗尽磁盘空间⽇志轮替会定期 将旧的⽇志⽂件归档或删除创建新的⽇志⽂件。⽇志轮替的主要⽬的是• 节省磁盘空间定期清理过时的⽇志⽂件避免占⽤过多磁盘空间。• 保持⽇志的易管理性通过轮替管理⽇志⽂件确保⽇志的存储不会变得混乱。• 提⾼性能避免单个巨⼤⽇志⽂件影响系统性能特别是在⾼流量环境下。在Linux系统中⽇志轮替通常由logrotate⼯具来执⾏。logrotate会根据配置⽂件的规则定期轮替 ⽇志⽂件安装logrotatednf -y install logrotatelogrotate 命令logrotate [选项] 配置⽂件名选项如果此命令没有选项则会按照配置⽂件中的条件进⾏⽇志轮替-v 显⽰⽇志轮替过程。加了-v 选项会显⽰⽇志的轮替的过程-f 强制进⾏⽇志轮替。不管⽇志轮替的条件是否已经符合强制配置⽂件中所有的⽇ 志进⾏轮替该命令主要是⽤于测试环节中使⽤ ⽤于测试配置的轮替⽅案是否⽣效配置文件说明cat /etc/logrotate.conf⽇志轮替规则/etc/logrotate.d/中包含了各种服务的⽇志配置⽂件每个⽂件指定了特定服务的⽇志轮替规则cd /etc/logrotate.d/var/log/hawkey.log { missingok # 如果日志文件不存在轮替时不报错直接跳过 notifempty # 如果日志文件是空的就不执行轮替避免生成无用的空备份 rotate 4 # 最多保留 4 份旧日志备份超过的会被删除 weekly # 按「周」为单位执行轮替 create # 轮替后自动创建新的空日志文件保证 DNF 能继续写入 }logrotate 配置⽂件的主要参数一、轮转周期什么时候转daily每天轮转一次weekly每周轮转一次默认monthly每月轮转一次yearly每年轮转一次二、保留份数留几个旧日志rotate N保留 N 个旧日志超过自动删除例rotate 7→ 保留最近 7 个三、按大小轮转更常用size 100M文件达到 100M 就切优先级高于时间maxsize 50M到 50M 立刻切没到时间也切minsize 10M不到 10M 不切到时间也不切四、压缩相关省磁盘compress旧日志用 gzip 压缩常用delaycompress本次不压下次轮转时再压上一次防锁文件nocompress不压缩不推荐五、文件不存在 / 空文件处理missingok日志文件不存在也不报错直接跳过非常常用notifempty日志为空就不轮转避免空文件六、建新日志权限必配create 0644 root root轮转后新建空日志权限 644属主 root简写create默认权限通常够用七、文件名带日期不覆盖、好排查dateext旧日志加日期后缀如xxx-20260530dateformat .%Y%m%d自定义日期格式要和 dateext 一起用八、执行脚本轮转前后触发prerotate轮转之前执行脚本postrotate轮转之后执行脚本常用如重启服务sharedscripts多个日志共用一次 postrotate否则每个文件都跑一次怎么设置日志轮替需求/var/log/alert.log 该⽇志是我们通过/etc/rsyslog.conf 配置⽂件⾃⼰⽣成的⽇志所以默认这 个⽇志是不会轮替的需求说明1- 设置为周轮替⼀次2- 保留6个轮替⽇志3- ⽇志不存在忽略⽇志的警告信息4- 在⽇志轮替之前执⾏去除⽇志a属性 以便于能够顺利完成轮替操作5- 在⽇志轮替之后执⾏重启rsyslog服务/bin/kill -HUP $(/bin/cat /var/run/rsyslogd.pid 2/dev/null) /dev/null注 在配置前 先对⽂件添加a属性对⽇志⽂件进⾏保护题目说明4a属性是什么a是 Linux 文件的 **“追加保护” 属性 **全称是append only。给文件加上a属性后你只能往文件里追加内容不能删除、修改、重命名或覆盖它。它是保护日志文件不被误删的常用手段很多生产环境都会给重要日志加上这个属性5/bin/kill -HUP $(/bin/cat /var/run/rsyslogd.pid 2/dev/null) 2/dev/null /dev/null这行代码是写在logrotate配置的postrotate里的作用是在日志轮替完成后让rsyslog服务重新加载配置继续往新的日志文件里写日志操作先给/var/log/alert.log增加a属性chattr a /var/log/alert.logchattrchangeattribute修改属性a给文件加上append only只能追加属性效果文件只能被追加写入不能被删除、修改、重命名用来保护日志文件不被误删。检查文件是否已经成功加上了a属性执行后会看到文件前面有个a标记说明生效了lsattr /var/log/alert.log配置针对alert.log⽇志⽂件的轮替的配置⽂件cd /etc/logrotate.d/用vi编辑器新建一个叫alert的文件然后把轮替规则写进去vi alerti插入添加以下内容/var/log/alert.log { weekly rotate 6 missingok sharedscripts prerotate chattr -a /var/log/alert.log endscript sharedscripts postrotate /bin/kill -HUP $(/bin/cat /var/run/rsyslogd.pid 2/dev/null) /dev/null endscript }1/var/log/alert.log { 下面所有规则都只对/var/log/alert.log这个文件生效{ }是规则的开始和结束标记里面的内容都是给这个日志文件用的2weekly按周轮替3表示最多保留6个旧日志备份超过的会被自动删除比如轮替后会生成alert.log.1、alert.log.2… 最多保留到alert.log.6防止日志文件无限变大占满磁盘4missingokmissing ok如果/var/log/alert.log这个文件不存在轮替时也不报错直接跳过5sharedscriptsshared scripts共享脚本多个日志文件轮替时prerotate和postrotate脚本只执行一次而不是每个文件都跑一次不加 sharedscripts默认匹配到 5 个日志文件 → 脚本执行 5 次6prerotate在轮替之前执行的脚本7chattr -a /var/log/alert.log 去掉日志文件的a属性只能追加、不能修改删除的保护属性轮替时需要改名、移动文件而a属性会阻止这些操作所以必须先去掉。8endscript脚本内容结束9postrotate轮替之后执行的脚本10/bin/kill -HUP $(/bin/cat /var/run/rsyslogd.pid 2/dev/null) /dev/null给rsyslog服务发一个HUP信号让它重新加载配置继续往新的alert.log文件里写日志。把错误信息和输出都丢到 “黑洞” 里避免logrotate日志里出现无关报错。重启logrotate.logsystemctl restart logrotate systemctl status logrotate执行强制轮替操作logrotate -vf /etc/logrotate.conf观察是否出现新的alter.log⽇志cd /var/log新日志alert.log空文件正在被写入旧日志alert.log-20260530改名后的备份不会再被写入观察新的alert.log⽂件是否存在a属性没有任何属性也可以说明轮替成功lsattr alert.log