在管理 CentOS 6 服务器时,有效管理日志文件是一项至关重要的任务,日志文件记录了系统运行的点滴,是排查问题、监控状态、审计操作的宝贵资源,如果放任不管,日志文件会不断增长,最终吞噬宝贵的磁盘空间,甚至可能导致系统服务中断。logrotate 这个内置于 CentOS 6 的强大工具,就成为了每位系统管理员不可或缺的得力助手。
logrotate:日志管理的自动化管家

logrotate 的核心职责是自动轮转、压缩、删除和邮寄日志文件,想象一下,您无需每天手动登录服务器去清理日志,logrotate 会根据您设定的规则,在恰当的时间点(通常是每天、每周或每月)执行以下关键操作:
- 轮转 (Rotate): 这是核心步骤,它可能涉及:
- 重命名现有日志文件: 将
secure.log重命名为secure.log.1。 - 创建新的空日志文件: 新的
secure.log会被创建出来,供相关服务继续写入。 - 处理多个归档: 系统通常会保留一定数量的旧日志文件(如
secure.log.1,secure.log.2.gz,secure.log.3.gz等),最旧的日志在达到保留数量限制后被删除。
- 重命名现有日志文件: 将
- 压缩 (Compress): 轮转后的旧日志文件(如
secure.log.1)通常会被压缩(例如变成secure.log.2.gz),以显著节省磁盘空间。gzip是默认的压缩工具。 - 删除 (Remove): 根据配置的保留策略(如保留 4 周、保留 10 个文件),最老的压缩日志文件会被自动删除,防止磁盘空间无限增长。
- 邮寄 (Mail): (可选)可以将轮转走的日志文件通过电子邮件发送给管理员,不过这个功能在现代运维中相对少用。
- 延迟压缩/脚本执行: 支持在轮转后执行自定义脚本(如通知服务重新打开日志文件),或延迟压缩直到下一个轮转周期。
CentOS 6 中的 logrotate 配置体系
CentOS 6 的 logrotate 配置清晰且灵活,主要通过以下几个文件和目录实现:
主配置文件:
/etc/logrotate.conf- 这是全局默认配置的入口点,它定义了适用于所有日志文件的通用规则(除非被特定配置覆盖)。
- 关键指令示例:
weekly: 默认每周轮转一次日志。rotate 4: 默认保留 4 份轮转后的旧日志(即log.1,log.2.gz,log.3.gz,log.4.gz)。create: 轮转后自动创建新的空日志文件(权限通常是 644 root root)。compress: 默认启用压缩旧日志。include /etc/logrotate.d: 这行非常重要!它告诉logrotate去加载/etc/logrotate.d/目录下的所有配置文件,这是管理特定服务日志的主要方式。dateext: (可能在主文件或子文件)使用日期(如YYYYMMDD)作为轮转日志的后缀,而非简单的递增数字,更清晰。missingok: 如果日志文件不存在,不报错,继续处理下一个。notifempty: 如果日志文件是空的,则不进行轮转。
服务/应用专属配置目录:
/etc/logrotate.d/- 这是配置
logrotate的核心位置,系统安装的许多服务(如rsyslog,httpd,nginx,mysql等)以及自定义应用,都会在这里放置自己的配置文件。 - 文件命名: 通常与服务或应用名称相关,
syslog,httpd,nginx,custom-app。 - 每个文件定义了针对特定日志文件或一组日志文件的轮转规则,这些规则会继承
/etc/logrotate.conf中的全局设置,但可以覆盖它们。 - 示例 (
/etc/logrotate.d/syslog的典型内容):/var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript }- 第一行: 指定了需要轮转的日志文件路径(多个路径可以空格分隔或分行列出)。
sharedscripts: 意味着在轮转了所有列出的日志文件之后,只执行一次postrotate/endscript中的脚本,如果不加这个,每个日志轮转完都会执行一次脚本。postrotate/endscript: 这是关键部分!它定义了在日志文件轮转之后需要执行的命令,对于syslog(或rsyslog),通常需要发送HUP信号 (kill -HUP) 给syslogd/rsyslogd进程,通知它重新打开日志文件(因为轮转后,它原来打开的文件描述符可能指向了被重命名的旧文件)。cat /var/run/syslogd.pid是为了获取进程 ID,2> /dev/null和|| true是为了避免命令失败导致logrotate报错退出。
- 这是配置
配置实践:定义您的轮转规则

为特定应用配置 logrotate 通常就是在 /etc/logrotate.d/ 下创建一个新文件(如 /etc/logrotate.d/myapp),以下是一个更详细的配置示例及解释:
# 轮转 /var/log/myapp/*.log 的所有日志文件
/var/log/myapp/*.log {
daily # 每天轮转一次 (覆盖全局的 weekly)
missingok # 没有日志文件也不报错
rotate 30 # 保留 30 份旧日志 (覆盖全局的 4)
compress # 压缩旧日志 (使用 gzip)
delaycompress # 延迟压缩:本次轮转的不压缩,下次轮转时再压缩上次的 (方便排查最新问题)
dateext # 使用日期格式后缀 (如 .log-20231015)
dateformat -%Y%m%d # 定义日期后缀格式 (可选,默认是 -%Y%m%d)
notifempty # 空日志不轮转
create 0640 myapp adm # 创建新日志文件,权限 0640,所有者 myapp,组 adm
sharedscripts # 所有日志轮转完后执行一次脚本
postrotate
# 这里写轮转后需要执行的命令,通常是重启应用或通知应用重新加载日志
# 重启服务
/sbin/service myapp reload > /dev/null 2>&1 || true
# 或者发送信号
/bin/kill -USR1 `cat /var/run/myapp.pid 2> /dev/null` 2> /dev/null || true
endscript
} 配置要点解析:
- 路径模式: 可以使用通配符 来匹配一组日志文件(如
/var/log/nginx/*.log),确保路径正确。 - 频率 (
daily,weekly,monthly,size): 选择符合日志生成速度的轮转频率,对于非常繁忙的日志,可以使用size指令(如size 100M)在达到特定大小时轮转,而不依赖时间。 - 保留数量 (
rotate): 根据磁盘空间和日志保留需求设定,保留 30 天日志是常见实践。 - 压缩与延迟:
compress节省空间。delaycompress对于需要经常查看最新归档日志的场景很有用(最新归档未压缩,方便直接查看)。 - 日期后缀 (
dateext,dateformat): 比数字后缀更直观,易于按日期查找日志。dateformat可定制格式。 - 新文件创建 (
create):非常重要! 指定新日志文件的权限、所有者和组,必须确保运行写入日志的进程(如myapp用户或nginx用户)有权限写入这个新创建的文件!权限错误是日志轮转失败最常见的原因之一。0640是兼顾安全和可写入性的常用权限。 - 脚本执行 (
postrotate):最关键的一步! 轮转后,必须通知写入日志的应用程序,让它知道日志文件已被移动/重命名,需要重新打开新的日志文件(通常是通过reload服务或发送特定信号如USR1/HUP)。不执行这一步,应用程序会继续向旧的(已被重命名)文件描述符写入,导致日志看似“停止记录”或写入到错误位置。 脚本命令要确保健壮性(使用|| true避免失败影响后续轮转)。 sharedscripts: 如果配置了多个日志路径,使用此选项确保脚本在所有日志轮转完成后只执行一次,而不是每个日志轮转一次。
测试与调试:确保配置生效
配置完成后,切勿直接等待自动运行,务必手动测试:
手动运行测试:
/usr/sbin/logrotate -d /etc/logrotate.d/myapp
-d选项代表调试 (Dry Run) 模式,它会模拟执行轮转过程,详细输出它会做什么(轮转哪些文件、压缩、删除、执行脚本等),但不会实际修改任何文件或执行脚本命令,这是检查配置语法和逻辑是否正确的第一步。
强制运行(谨慎使用):

/usr/sbin/logrotate -f /etc/logrotate.d/myapp
-f选项强制logrotate立即执行指定配置文件的轮转操作,无论是否到了预定时间。这会实际执行轮转、压缩、删除和脚本命令。 测试postrotate脚本是否真正能让应用重新打开日志时,可能需要使用此命令,务必在非关键时段进行,并确认应用日志写入恢复正常。
检查执行结果:
- 查看日志文件目录 (
ls -l /var/log/myapp/):是否出现了轮转后的文件(如.log-20231015,.log.1.gz)?新的.log文件是否被创建且权限正确? - 检查当前日志文件 (
tail -f /var/log/myapp/current.log):在强制轮转并执行postrotate脚本后,新的日志条目是否成功写入到新的current.log文件中? - 查看系统日志 (
/var/log/messages或syslog日志):logrotate自身的执行情况(尤其是错误信息)通常会记录在这里。
- 查看日志文件目录 (
常见问题与注意事项
- 日志“停止记录”: 几乎 99% 的原因是
postrotate脚本配置错误或未执行成功,导致应用程序没有重新打开新日志文件,仔细检查脚本命令是否正确(服务名、PID 文件路径、信号类型)以及执行权限,使用-f测试并观察tail -f。 - 权限问题 (
Permission denied): 检查create指令设置的权限和所有者/组,确保运行写入日志的进程用户有权限写入新创建的文件,检查父目录的权限。 - 磁盘空间未释放: 如果应用程序在轮转后仍然持有旧日志文件的打开句柄(通常是因为
postrotate脚本未正确通知应用),即使文件被重命名和压缩,其占用的磁盘空间也可能不会立即释放,直到应用程序关闭该句柄(通常是重启应用),使用lsof | grep deleted可以查找被删除但仍被进程占用的文件。 - CentOS 6 的生命周期: CentOS 6 已于 2020 年 11 月结束生命周期 (EOL),不再接收官方安全更新或维护,强烈建议将仍在运行的 CentOS 6 系统升级到受支持的操作系统(如 CentOS 7/8 Stream, Rocky Linux, AlmaLinux 等),在 EOL 系统上运行存在安全风险,本文内容仅作为管理遗留系统的参考。
- 日志安全: 敏感的日志文件(如包含用户认证信息的
secure.log)权限应严格控制(如600),create指令也要设置严格的权限。
个人观点
管理服务器日志就像打理一座花园,定期修剪(轮转)和整理(压缩归档)是保持其健康、可用且不失控的关键。logrotate 提供的自动化能力极大地解放了管理员的精力,自动化工具的成功运行依赖于精准的配置,特别是 postrotate 脚本的正确性——这往往是成败的分水岭,在 CentOS 6 这样的旧系统上维护时,更需谨慎测试,同时务必将其迁移计划提上日程,安全始终是第一位的,理解 logrotate 的运作机制,不仅能解决日志管理问题,更能加深对 Linux 系统服务和文件处理的理解,是每一位运维人员值得掌握的基础技能,清晰的日志轮转策略,是服务器稳定运行、问题可追溯的重要保障。
