HCRM博客

CentOS 6系统下logrotate配置指南

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

logrotate:日志管理的自动化管家

CentOS 6系统下logrotate配置指南-图1

logrotate 的核心职责是自动轮转、压缩、删除和邮寄日志文件,想象一下,您无需每天手动登录服务器去清理日志,logrotate 会根据您设定的规则,在恰当的时间点(通常是每天、每周或每月)执行以下关键操作:

  1. 轮转 (Rotate): 这是核心步骤,它可能涉及:
    • 重命名现有日志文件:secure.log 重命名为 secure.log.1
    • 创建新的空日志文件: 新的 secure.log 会被创建出来,供相关服务继续写入。
    • 处理多个归档: 系统通常会保留一定数量的旧日志文件(如 secure.log.1, secure.log.2.gz, secure.log.3.gz 等),最旧的日志在达到保留数量限制后被删除。
  2. 压缩 (Compress): 轮转后的旧日志文件(如 secure.log.1)通常会被压缩(例如变成 secure.log.2.gz),以显著节省磁盘空间。gzip 是默认的压缩工具。
  3. 删除 (Remove): 根据配置的保留策略(如保留 4 周、保留 10 个文件),最老的压缩日志文件会被自动删除,防止磁盘空间无限增长。
  4. 邮寄 (Mail): (可选)可以将轮转走的日志文件通过电子邮件发送给管理员,不过这个功能在现代运维中相对少用。
  5. 延迟压缩/脚本执行: 支持在轮转后执行自定义脚本(如通知服务重新打开日志文件),或延迟压缩直到下一个轮转周期。

CentOS 6 中的 logrotate 配置体系

CentOS 6 的 logrotate 配置清晰且灵活,主要通过以下几个文件和目录实现:

  1. 主配置文件:/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: 如果日志文件是空的,则不进行轮转。
  2. 服务/应用专属配置目录:/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 报错退出。

配置实践:定义您的轮转规则

CentOS 6系统下logrotate配置指南-图2

为特定应用配置 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 如果配置了多个日志路径,使用此选项确保脚本在所有日志轮转完成后只执行一次,而不是每个日志轮转一次。

测试与调试:确保配置生效

配置完成后,切勿直接等待自动运行,务必手动测试:

  1. 手动运行测试:

    /usr/sbin/logrotate -d /etc/logrotate.d/myapp
    • -d 选项代表调试 (Dry Run) 模式,它会模拟执行轮转过程,详细输出它会做什么(轮转哪些文件、压缩、删除、执行脚本等),但不会实际修改任何文件或执行脚本命令,这是检查配置语法和逻辑是否正确的第一步。
  2. 强制运行(谨慎使用):

    CentOS 6系统下logrotate配置指南-图3
    /usr/sbin/logrotate -f /etc/logrotate.d/myapp
    • -f 选项强制 logrotate 立即执行指定配置文件的轮转操作,无论是否到了预定时间。这会实际执行轮转、压缩、删除和脚本命令。 测试 postrotate 脚本是否真正能让应用重新打开日志时,可能需要使用此命令,务必在非关键时段进行,并确认应用日志写入恢复正常。
  3. 检查执行结果:

    • 查看日志文件目录 (ls -l /var/log/myapp/):是否出现了轮转后的文件(如 .log-20231015, .log.1.gz)?新的 .log 文件是否被创建且权限正确?
    • 检查当前日志文件 (tail -f /var/log/myapp/current.log):在强制轮转并执行 postrotate 脚本后,新的日志条目是否成功写入到新的 current.log 文件中?
    • 查看系统日志 (/var/log/messagessyslog 日志):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 系统服务和文件处理的理解,是每一位运维人员值得掌握的基础技能,清晰的日志轮转策略,是服务器稳定运行、问题可追溯的重要保障。


本站部分图片及内容来源网络,版权归原作者所有,转载目的为传递知识,不代表本站立场。若侵权或违规联系Email:zjx77377423@163.com 核实后第一时间删除。 转载请注明出处:https://blog.huochengrm.cn/pc/35618.html

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
请登录后评论...
游客游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~