将压缩日志文件移到 /var/log 外部

将压缩日志文件移到 /var/log 外部

我正在寻找有关 logrotate 的建议。

我最近安装了 log2ram 以节省我的 SSD。由于我没有使用全部 24Gb RAM,因此我将 2Gb 分配给 /var/log/。目前使用+/- 300Mb。

我希望 logrotate 将任何子目录中可能以 .gz 结尾的任何文件移动到 /var/old.log/ 并维护子目录结构。

我做了一些研究并找到了可能的解决方案,但现在提出了问题。

使用 find 移动文件时保留目录结构

压缩旧日志文件并移动到新目录

  1. 当 logrotate 运行此辅助脚本来移动这些文件时,例如我移动 /var/log/file.log.2.gz 时,在旋转日志而不是移动 file.log 时,它不会创建新的 file.log.2.gz 。 2.gz 到 file.log.3.gz,因为 file.log.2.gz 不再存在。然后最终脚本会因为同名而覆盖旧日志

  2. 我不完全理解 olddir 选项,因为我知道这可以做我想做的事。但手动状态要谨慎使用通配符。这里有任何帮助吗

  3. 何时执行此操作,/var/log 在引导期间使用 /var/hdd.log/ 的内容创建,然后在重新引导时更新 /var/hdd.log。

我希望 logrotate 将压缩文件移动到其他目录,这样它就不会加载到 tmpfs 上,但我不想编辑每个 /etc/logrotate.d/* 文件。

我想也许在启动期间 log​​2ram 创建 /var/log 之前放一些东西,但我不知道在哪里。

该系统 24/7 运行,我尝试尽可能少地重新启动。操作系统:Ubuntu 22.04 LTS

有时手册太明显,有时又非常模糊。也许有人可以用更复杂或更简单的方式解释它,让我理解。

感谢您的时间。

答案1

  1. 是的,使用mv不带任何选项的命令将覆盖任何同名文件。防止这种情况的一种方法是使用该--backup=numbered选项,该选项会创建具有该格式的新文件,filename~*[number]*~而不是覆盖现有文件。另一种选择是使用其他文件命名格式,例如 dateext,它将旋转日志重命名为文件名-YYYYMMDD以避免覆盖同名文件。

  2. olddir是旋转日志应存储的位置。 logrotate 手册页警告不要使用通配符,因为如果缺少此选项,则旋转的日志将存储在同一目录中。如果使用通配符指示 logrotate 轮换所有文件 ( *),那么它也会影响轮换日志。

  3. 要定义在启动和关闭时执行的任务,我建议使用 cronjobs 或自定义编写的 init 服务。这是一个应该有助于解决您的问题的示例logrotate

/var/log/**/*.log {
    daily
    compress
    dateext
    missingok
    noifempty
    sharedscripts
    postrotate
        cd /var/log && find . -type f -name '*.gz' -exec rsync -aR {} /var/old.log/ \;
    endscript

相关内容