我有一个服务,它坚持将日志文件保存在糟糕的位置。在尝试更改日志文件保存位置的所有尝试都失败后,我的下一个想法是在更干净的地方创建指向这些文件的硬链接。这让我产生了一个担忧:
如果我配置 logrotate 来管理这些日志文件,它会按预期工作吗(轮换日志,保持链接正常工作)?还是 logrotate 会意外破坏链接,让日志堆积在它们的原始位置,而不是我的中心位置?
我相信我可以配置 logrotate 在必要时在旋转后重新创建硬链接。但是,有必要吗?
答案1
要回答你的问题,这取决于你进行哪种旋转。例如,将发生以下过程:
复制并截断方法:
- Logrotate 将日志文件复制到新的日志文件。
- 新的日志文件仅显示在旧位置。
- Logrotate 截断旧文件。
- 这会将旧文件在两个位置都变为零字节。
- 日志文件继续从应用程序填充。
这会将日志文件备份留在旧位置。
解决这个问题的方法很简单:配置 logrotate 来轮换新的位置。旧文件仍将包含正在增长的文件,但仅此一个。
复制并创建方法:
- Logrotate 将文件复制到新的日志文件。
- 该日志文件未硬链接,仅显示在新位置。
- Logrotate 删除旧的日志文件。
- 由于硬链接,这只会删除 logrotate 运行目录中的硬链接。其他目录仍将保留该文件的完整副本。
- Logrotate 创建一个新的日志文件。
- 这不会与其他位置硬链接。
这种方法最成问题,并且您需要一些后旋转魔法来清理它。
答案2
不要链接到文件:链接到目录。如果链接到文件,则当应用程序创建新日志文件时可能会出现问题,无论是作为日志轮换的一部分(取决于如何完成)还是当您停止并稍后重新启动应用程序时。
ln -s /path/to/where/application/creates/logs/ /var/log/application
答案3
我认为您可以使用符号链接到您想要的新位置并告诉 logrotate 在日志实际所在的文件夹中轮换日志;
ln -s /path/file /path/to/newlink