在日常运维中,日志管理是一项至关重要的任务。如果不定期清理和归档日志,服务器上的日志文件会迅速增长,最终导致磁盘空间耗尽,影响系统的正常运行。而 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
未自动执行
一般 logrotate
由 cron
或 systemd
触发:
cat /etc/cron.daily/logrotate
如果 cron
未执行,可以尝试手动触发:
run-parts /etc/cron.daily