我们一直在使用 syslog-ng 来记录我们的 postgres 日志。除此之外,我们每 5 分钟运行一次 logrotate,它还会对文件进行 gzip 压缩。最近,我们注意到这些 postgres 日志在文件开头包含大量空字符。后来我们意识到空字符占用的空间等于文件之前的大小。
研究(https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=733856) 关于为什么会发生稀疏,我们意识到问题在于 syslog-ng 无法从头开始写入日志。我们尝试编写一个 postrotate 脚本,该脚本将杀死 -HUP syslog-ng。我们试过了,但徒劳无功。许多人通过设置 o_append 位解决了这个问题。有谁知道如何为 syslog-ng 设置 o_append 位,以便它不会从最后维护的写入头写入,而是从文件的开头开始写入?
答案1
假设您谈论的是 /var/log/postgresql/postgresql--main.log:syslog 不是您的控制点。正如 wurtel 指出的那样,这些日志不是通过 syslog 发送的,而是 postgres 进程的 stdout/stderr
这就是为什么 postgres 的标准 logrotate 必须是 copytruncate,即复制文件然后将其截断为零字节。然后重定向的输出将再次从文件开头开始写入(至少在标准的开箱即用系统上是这样的)。
但奇怪的是,如果您的 logrotate 不是 copytruncate,那么我预计在 rotate 之后输出将转到 .1 文件。您能分享一下您正在使用的 logrotate 配置吗?我怀疑那里有线索。