Linux日志管理之logrotate

在日常运维中,日志管理是一项至关重要的任务。如果不定期清理和归档日志,服务器上的日志文件会迅速增长,最终导致磁盘空间耗尽,影响系统的正常运行。而 logrotate 作为 Linux 服务器上广泛使用的日志轮转工具,提供了一种自动化的日志管理方案,使我们能够控制日志的大小、保留周期以及归档方式。

一、 不需要安装

logrotate 主要用于定期轮转和管理日志文件。它通过配置文件定义规则,例如:

  • 何时进行日志轮转(按大小或时间)
  • 轮转后是否进行压缩
  • 保留多少份历史日志
  • 轮转后是否执行自定义命令(如重启服务)

在大多数 Linux 发行版中,logrotate 作为默认工具安装在系统中,可以通过以下命令检查是否已安装:

logrotate --version

二、 全局配置

logrotate 的全局配置通常位于 /etc/logrotate.conf,而不同服务的日志配置通常存放在 /etc/logrotate.d/ 目录下。

让我们看一个典型的 /etc/logrotate.conf 示例:

# 每天检查一次日志轮转
daily

# 只保留最近 7 天的日志
rotate 7

# 轮转后压缩旧日志
compress

# 旧日志使用 .gz 压缩格式
delaycompress

# 如果日志文件为空,不进行轮转
notifempty

# 创建新日志文件时,使用相同的权限
create 0640 root adm

# 包含 `/etc/logrotate.d/` 目录下的所有规则
include /etc/logrotate.d

三、 自定义配置

假设我们有一个自定义应用,它的日志存储在 /var/log/myapp.log,我们希望:

  • 日志每天轮转
  • 只保留 10 天的日志
  • 轮转后压缩旧日志
  • 轮转后通知应用重新打开日志文件

可以在 /etc/logrotate.d/myapp 里创建如下规则:

/var/log/myapp.log {
    daily                # 每天轮转一次
    rotate 10            # 只保留最近 10 个日志文件
    compress             # 轮转后进行压缩
    delaycompress        # 延迟压缩,保留最新的一个轮转日志未压缩
    missingok            # 如果日志文件不存在,不报错
    notifempty           # 如果日志为空,不进行轮转
    create 0644 root root  # 创建新日志文件,权限 0644,所有者 root
    postrotate systemctl restart myapp  # 轮转后重启服务,确保应用日志输出正确
    endscript
}

四、手动测试

在实际生效前,我们可以手动运行 logrotate 进行测试:

logrotate -d /etc/logrotate.d/myapp

其中 -d 参数表示“调试模式”,仅显示 logrotate 计划执行的操作,但不会实际执行。

如果需要立即执行日志轮转,可以运行:

logrotate -f /etc/logrotate.d/myapp

-f 参数表示“强制执行”,即使日志未达到轮转条件,也会立即执行轮转。

五、常见问题及解决方案

① 轮转后日志未更新

如果应用未正确切换到新的日志文件,可能是因为应用进程仍然占用旧日志文件。可以使用 lsof 查看:

lsof | grep myapp.log

如果应用仍然持有旧文件,尝试 postrotate 里加上 kill -HUP 让应用重新打开日志文件。

logrotate 未自动执行

一般 logrotatecronsystemd 触发:

cat /etc/cron.daily/logrotate

如果 cron 未执行,可以尝试手动触发:

run-parts /etc/cron.daily
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容