Ubuntu 16.04 服务器:安装和配置 logrotate
logrotate 是一个根据频率或大小条件替换日志文件的工具,并通过存储、压缩或删除管理以前的文件。在 Ubuntu 上,它可以管理持续增长的日志,但实际的替换时间取决于 logrotate 的执行计划和配置条件。
Ubuntu 16.04 的支持和准备
Ubuntu 16.04 LTS的一般安全维护以及Ubuntu Pro的一般扩展安全维护(ESM)已结束。Canonical提供单独的遗留附加服务,因此请在Ubuntu 16.04支持指南中查看覆盖范围和费用,并计划尽可能升级到受支持的Ubuntu版本。以下基本原则也适用于其他版本,但具体行为可能因已安装的logrotate版本和执行计划而有所不同。
首先,检查是否已安装,如果Ubuntu上不存在该软件包,请安装。在更改生产服务器设置之前,请确保检查现有设置和必要日志的备份与恢复方法。
logrotate --version
sudo apt update
sudo apt install logrotate
检查默认设置和执行计划
全局设置通常在 /etc/logrotate.conf 中,如果文件配置为包含 /etc/logrotate.d/,则会读取单独设置。检查服务器上的实际文件。在安装了 Apache 软件包的环境中,可能存在 /etc/logrotate.d/apache2,但日志路径和设置取决于安装环境。
cat /etc/logrotate.conf
ls -l /etc/logrotate.d/
cat /etc/logrotate.d/apache2
在没有 Apache 配置文件的系统上,最后一个命令可能会失败。不要在两个配置中重复管理相同的日志路径。logrotate 本身不会持续运行或调度自己的执行。在 Ubuntu 16.04 上,它通常通过 /etc/cron.daily/logrotate 定期执行,因此请检查该文件以及是否通过 cron 执行。在其他版本中,实际调度可能有所不同,例如使用 systemd 定时器。
创建独立的测试日志和设置
以下练习使用一个新的临时目录,而不是生产日志。在同一个 shell 中按顺序执行并检查输出路径。它使用临时目录和独立的状态文件,因此不会修改系统现有的 logrotate 设置或状态。
demo_dir=$(mktemp -d)
printf 'first log line\n' > "$demo_dir/app.log"
cat > "$demo_dir/logrotate.conf" <<EOF
$demo_dir/app.log {
daily
rotate 3
missingok
notifempty
compress
delaycompress
create 0600
}
EOF
printf 'Test directory: %s\n' "$demo_dir"
cat "$demo_dir/logrotate.conf"
daily 是一个每日轮转条件,rotate 3 是一个保留最多三次轮转的之前日志的设置。missingok 在文件不存在时避免错误,notifempty 不轮转空日志。compress 压缩之前的日志,delaycompress 延迟最近轮转日志的压缩,直到下一次轮转。create 0600 在轮转后创建新日志文件时设置权限。
此示例中的配置文件未在系统计划中注册,并且没有实际的应用程序写入测试日志。设置 daily 并不会为自身创建执行计划。请参考官方 logrotate 手册 ,以检查适合您已安装版本的选项和条件。
检查试运行和实际轮换
首先,在调试模式下检查设置和预期行为。-d 不会更改日志或更新状态文件。使用新的状态文件时,输出可能会显示还未到轮换时间。
logrotate -d -s "$demo_dir/state" "$demo_dir/logrotate.conf"
仅在练习文件中强制旋转并检查结果。-f 即使条件不满足也会强制旋转,因此在实际操作日志中不应随意使用。
logrotate -v -f -s "$demo_dir/state" "$demo_dir/logrotate.conf"
ls -l "$demo_dir"
cat "$demo_dir/app.log.1"
如果成功,原始内容在 app.log.1 中,并会创建一个新的 app.log。最近旋转的部分尚未压缩,因为 delaycompress。向新日志添加内容并再次强制旋转后,前一次旋转的部分通常会被压缩为 app.log.2.gz。
printf 'second log line\n' >> "$demo_dir/app.log"
logrotate -v -f -s "$demo_dir/state" "$demo_dir/logrotate.conf"
ls -l "$demo_dir"
gzip -cd "$demo_dir/app.log.2.gz"
你可以从上一个命令检查第一行日志。本练习不会复现一个记录日志的运行服务。完成练习后,检查保存输出的临时路径,并清理任何不再需要的文件。
应用于生产服务时
即使文件已被重命名,正在运行的程序仍然可以继续写入之前的日志文件。检查所提供的流程以让服务重新打开日志文件,并从现有包中查看postrotate脚本,验证新文件的所有者、组和权限是否适合该服务。在更改现有的Apache规则之前,请查看发行版和服务文档,并备份您的配置。
copytruncate 会复制日志,然后在原地截断它;它可以用于无法重新打开其日志文件的程序,但在复制和截断之间可能会丢失日志。尽可能地,先检查服务是否有重新打开日志的方法。rotate 3 指的是要保留的轮换次数,而不是以天数或大小为限制,因此应单独检查保留策略和磁盘使用情况。
日志未轮转时的检查
- 验证配置文件是否包含在全局设置中,并且目标路径是否与实际日志匹配。空文件在
notifempty中不会旋转。 - 检查 cron 或定时器是否实际运行,以及是否需要根据状态文件和周期性条件进行轮转。
daily并不保证在每日检查一次的环境中每天精确时间进行轮转。 - 在调试输出和调度程序错误日志中查找权限、所有权、语法和重复路径的问题。在将
-f应用于操作日志之前,先审查结果和恢复计划。




