86·系统监控与调优进阶

日志管理与 logrotate

logslogrotate

第86课 - 日志管理与 logrotate

学习目标

通过本课的学习,你将能够:

  1. 理解日志的重要性:知道常见的日志文件存放位置及其内容。
  2. 掌握 logrotate 的作用:理解为什么需要对日志进行轮转(轮换)管理。
  3. 配置 logrotate 策略:能够编写或修改 logrotate 配置文件,实现日志的自动压缩、轮转和清理。
  4. 调试 logrotate 配置:学会手动运行 logrotate 并检查其执行状态。

核心概念

1. 为什么需要管理日志?

系统日志就像电脑的“黑匣子”,记录了系统运行时发生的一切事件:谁在什么时候做了什么操作,哪个服务启动或失败了。常见的日志文件位于 /var/log/ 目录下:

  • /var/log/syslog/var/log/messages:系统通用日志。
  • /var/log/auth.log:用户认证相关日志(登录、sudo等)。
  • /var/log/kern.log:内核日志。
  • /var/log/dpkg.log:软件包安装/卸载日志。

问题:如果日志文件只增不减,最终会填满整个磁盘分区,导致系统无法正常运行。

解决方案:日志轮转(Log Rotation)。定期将旧的日志文件重命名、压缩、归档,并创建一个新的空日志文件继续写入。logrotate 就是 Linux 系统中用于自动化完成这项工作的强大工具。

2. Logrotate 是什么?

logrotate 是一个基于配置文件来管理日志文件大小的程序。它通常由系统的定时任务(cron)每天自动运行一次。

其核心工作逻辑是:

  1. 轮转:将当前日志文件(如 app.log)重命名为带序号的旧文件(如 app.log.1)。
  2. 压缩:可选地将旧日志文件压缩成 .gz 格式以节省空间。
  3. 创建:生成一个全新的、空的日志文件供服务继续写入。
  4. 清理:当旧的轮转日志文件数量超过预设值时,删除最老的那些。

代码示例

示例1:查看 logrotate 主配置和默认设置

首先,我们看一下 logrotate 的主配置文件 /etc/logrotate.conf

# 查看主配置文件
cat /etc/logrotate.conf

你会看到类似如下的默认设置:

# 全局默认设置
weekly          # 默认每周轮转一次
rotate 4        # 最多保留4个轮转文件
create          # 轮转后创建新的空日志文件
# compress      # 默认不压缩,若需压缩则取消注释这行
include /etc/logrotate.d  # 包含其他服务的独立配置文件

关键点include /etc/logrotate.d 这一行非常重要。它意味着大多数应用程序(如 Nginx, Apache, MySQL)的日志轮转规则,都以独立的配置文件形式放在 /etc/logrotate.d/ 目录下,而不是都写在主配置文件里。

示例2:为自定义应用程序配置 logrotate

假设你有一个运行在 /var/log/myapp/ 目录下的应用程序,它有两个日志文件:access.logerror.log。你需要为它创建一个轮转策略。

创建一个新配置文件:

sudo vi /etc/logrotate.d/myapp

写入以下配置:

/var/log/myapp/access.log
/var/log/myapp/error.log {
    daily               # 每天轮转
    missingok           # 如果日志文件缺失,不报错
    rotate 7            # 保留最近7天的轮转日志
    compress            # 压缩旧日志 (使用 gzip)
    delaycompress       # 延迟一次压缩(即轮转后不立即压缩,下次轮转时再压缩)
    notifempty          # 如果日志文件为空,则不进行轮转
    create 0640 myuser mygroup  # 创建新日志文件,并设置权限和所有者
    sharedscripts       # 多个日志文件共用下面的脚本
    postrotate          # 轮转后执行的脚本
        # 重启应用程序服务,使其向新日志文件写入(这是常见操作)
        systemctl restart myapp.service
    endscript
}

配置项通俗解释

  • daily/weekly/monthly:轮转频率。
  • rotate N:保留 N 个轮转后的旧日志文件。
  • compress:使用 gzip 压缩,旧日志变成 .gz 文件。
  • postrotate ... endscript:轮转后运行的命令。很多服务(如 Nginx, Apache)需要你向它们发送一个特定信号(如 kill -USR1)来通知它们重新打开日志文件,而不是简单地重启服务。

示例3:手动运行和调试 logrotate

当你修改了配置文件后,最好进行测试。

# 以调试模式(不真正执行)运行 logrotate,查看它会做什么
sudo logrotate -d /etc/logrotate.conf

# 以详细模式运行,并强制执行轮转(用于测试)
sudo logrotate -vf /etc/logrotate.d/myapp
  • -d:调试模式 (debug),仅显示操作,不实际执行。
  • -v:详细模式 (verbose),显示更详细的信息。
  • -f:强制模式 (force),即使未到轮转时间也强制执行。

查看调试输出,确保没有错误(如权限问题、路径错误)。强制运行后,检查 /var/log/myapp/ 目录,你应该能看到压缩后的旧日志和一个新的空 access.log

实践练习

练习1:查看与分析现有日志

  1. 使用 ls -lh /var/log/ 命令,查看 /var/log/ 目录下有哪些日志文件及其大小。
  2. 使用 tail -n 20 /var/log/syslog 命令,查看系统日志的最后20行,了解系统最近发生了什么。

练习2:配置轮转策略

假设你的博客程序 /var/log/blog/error.log 增长很快。 任务:在 /etc/logrotate.d/ 下创建一个配置文件 blog,要求:

  • 每天轮转一次。
  • 保留最近 14 天的日志。
  • 轮转后立即压缩日志。
  • 如果日志文件为空,则不轮转。
  • (可选)轮转后重启博客服务 blog.service

练习3:综合调试

  1. 为你自己在练习2中创建的配置文件运行调试命令 (logrotate -d /etc/logrotate.d/blog),检查配置语法。
  2. 使用强制模式 (logrotate -vf /etc/logrotate.d/blog) 执行一次,并观察输出。
  3. 使用 ls -l /var/log/blog/ 验证旧日志是否已被轮转和压缩。

常见错误

  1. 权限不足:logrotate 通常由 root 用户的 cron 任务运行。如果你的应用程序以特定用户运行,确保在 create 指令中设置了正确的所有者和权限 (create 0640 user group)。
  2. 忘记通知服务:很多服务会保持旧日志文件的句柄(handle)打开。仅仅重命名文件不够,必须通过 postrotate 脚本通知服务重新打开日志文件。常见方式有:
    • systemctl restart nginx.service (重启服务)
    • nginx -s reopen (发送特定信号)
    • kill -USR1 $(cat /run/nginx.pid) (向主进程发送 USR1 信号)
  3. 配置文件语法错误:logrotate 的配置对格式敏感。花括号 {} 必须单独占一行,指令末尾可以加分号也可以不加。遇到问题时,先用 logrotate -d 调试。
  4. 日志路径不匹配:配置文件中指定的日志路径必须与应用程序实际写入的日志路径完全一致,包括文件名。

小结

本课我们学习了 Linux 系统中至关重要的日志管理知识:

  • 日志位置:主要集中在 /var/log/ 目录。
  • 管理工具logrotate 是自动化日志轮转、压缩和清理的标准工具。
  • 配置结构:全局配置在 /etc/logrotate.conf,具体应用配置在 /etc/logrotate.d/
  • 核心配置项:理解了轮转频率(daily等)、保留份数(rotate)、压缩(compress)以及轮转后动作(postrotate)。
  • 调试方法:务必掌握使用 -d (调试) 和 -vf (强制执行) 选项来测试和验证你的配置文件,这是避免线上事故的关键。

良好的日志管理习惯能确保系统的稳定运行,并在出现问题时为你提供宝贵的排查线索。下一课,我们将学习如何使用 rsyslog 将来自多台服务器的日志集中到一台日志服务器上,构建更强大的监控体系。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「syslog 与 rsyslog 集中日志」 以巩固所学知识。