我正在寻找有关 logrotate 的建议。
我最近安装了 log2ram 以节省我的 SSD。由于我没有使用全部 24Gb RAM,因此我将 2Gb 分配给 /var/log/。目前使用+/- 300Mb。
我希望 logrotate 将任何子目录中可能以 .gz 结尾的任何文件移动到 /var/old.log/ 并维护子目录结构。
我做了一些研究并找到了可能的解决方案,但现在提出了问题。
当 logrotate 运行此辅助脚本来移动这些文件时,例如我移动 /var/log/file.log.2.gz 时,在旋转日志而不是移动 file.log 时,它不会创建新的 file.log.2.gz 。 2.gz 到 file.log.3.gz,因为 file.log.2.gz 不再存在。然后最终脚本会因为同名而覆盖旧日志
我不完全理解 olddir 选项,因为我知道这可以做我想做的事。但手动状态要谨慎使用通配符。这里有任何帮助吗
何时执行此操作,/var/log 在引导期间使用 /var/hdd.log/ 的内容创建,然后在重新引导时更新 /var/hdd.log。
我希望 logrotate 将压缩文件移动到其他目录,这样它就不会加载到 tmpfs 上,但我不想编辑每个 /etc/logrotate.d/* 文件。
我想也许在启动期间 log2ram 创建 /var/log 之前放一些东西,但我不知道在哪里。
该系统 24/7 运行,我尝试尽可能少地重新启动。操作系统:Ubuntu 22.04 LTS
有时手册太明显,有时又非常模糊。也许有人可以用更复杂或更简单的方式解释它,让我理解。
感谢您的时间。
答案1
是的,使用
mv
不带任何选项的命令将覆盖任何同名文件。防止这种情况的一种方法是使用该--backup=numbered
选项,该选项会创建具有该格式的新文件,filename~*[number]*~
而不是覆盖现有文件。另一种选择是使用其他文件命名格式,例如 dateext,它将旋转日志重命名为文件名-YYYYMMDD以避免覆盖同名文件。olddir
是旋转日志应存储的位置。 logrotate 手册页警告不要使用通配符,因为如果缺少此选项,则旋转的日志将存储在同一目录中。如果使用通配符指示 logrotate 轮换所有文件 (*
),那么它也会影响轮换日志。要定义在启动和关闭时执行的任务,我建议使用 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