以节省空间的方式存档日志的最佳方法是什么?

以节省空间的方式存档日志的最佳方法是什么?

已经确定journald日志巨大。在这个特定的系统上,日志每周增长约 3GB。出于审计目的,我希望将系统日志保存的时间比我可以轻松存储在该系统上的时间更长;这只会是“以防万一”的存储,不需要快速检索。以节省空间的方式存档这些日志的最佳方法是什么?

我正在考虑定期做某种事情journalctl | xz >>/var/log/old-logs.txt.xz,但就 CPU 使用率而言这会非常浪费,会一次又一次地重新存档相同的数据部分,而且如果日志被 journalctl 删除,可能会错过日志,所以也许有更好的方法?

答案1

journald 会轮换自己的文件,因此可以安全地将旧文件(@文件名中始终带有 )复制到其他地方、压缩它们或对它们进行任何操作。如果需要查看它们,journalctl可以使用命令行选项指向特定的日志文件--file

您还应该看到journald.conf用于限制 journald 磁盘使用的选项。

答案2

确实,xz 压缩可能会给你最好的压缩级别。

但是xz压缩日志不能用journalctl查询。

另一种方法是使用文件系统压缩。我使用 btrfs 和 zstd 压缩来实现这一点,它使我的空间使用量减少了约 10 倍,并且仍然可以通过 journalctl 交互日志。我不建议对 /var/log/journal 使用 btrfs 卷,因为 journalctl 会一直用No_COW属性标记其目录(参见lsattr),这会阻止压缩。可以像我在设置中所做的那样克服这个问题,但它更脆弱、更复杂。另一种方法是将旧日志文件移动到单独的压缩目录中。类似这样的内容:

mkfs.btrfs "$BLOCK_DEVICE_PATH"
mkdir /var/log/journal_archive

# With my data zstd compression level gives best compression/speed ratio.
# Your mileage may vary.
#Default level 3 is quite good so you might just stick with the default
mount -o compress=zstd:8 "$BLOCK_DEVICE_PATH" /var/log/journal

# To archive old logs (older than a week):
find /var/log/journal/$MACHINEID/ -name '*@*.journal' -mtime +7 -exec mv -v {} /var/log/journal_archive \;

# To query old logs
journalctl --directory=/var/log/journal_archive

# Cleanup archive to keep 20GB of uncompressed files
journalctl --vacuum-size=20G --directory /var/log/journal_archive

相关内容