PostgreSQL 9.1 日志文件更改

3
我有一个标准的Ubuntu postgres9.1安装一直在运行,我不能停止它。
关于日志记录目标方面没有进行特别配置, 所以有一个 (某种方式轮转的) 日志文件 /var/log/postgresql/postgresql-9.1-main.log。 我认为,它获取了进程的标准输出。
我想要的是配置一个不同的文件目标,并且在不重启的情况下, (抱歉,没有收集器,没有syslog ... 需要重新启动) 但通过重新配置,新的子进程使用该文件。
这有可能吗? 谢谢。
2个回答

4
我认为这相对简单。不幸的是,它需要使用日志收集器,这需要重新启动才能启用。如果没有这个,你无法在分区之间移动日志。
你可以在以下位置配置要使用的日志:/etc/postgresql/<version>/<cluster>/postgresql.conf log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' 一旦更改了这个设置,你需要运行service postgresql reload来使其生效。
或许我应该明确一点,这个答案的重点在于你可以使用service postgresql reload而不必重新启动服务器。

我非常确定这将被视为重新启动...除非他的意思是他无法重新启动系统。我理解他的意思是他无法重新启动postgres。 - Falmarri
1
嗯,我要重新检查文档。我认为reload的整个意义在于它不是重启?它只是向二进制文件发送重新加载配置的信号。...在我的服务器上检查了一下,并没有使客户端断开连接。所以不,reload并不是重启。 - Philip Couling
如果无法更改问题中提到的logging_collector,并且其已被禁用,则log_filename将被忽略。 - Daniel Vérité
如果 logging_collector 被禁用了... log_filename 将被忽略。 不,它不会被忽略。当我重启(开发系统)时,它将会生效:没有地方记录日志。 (当然,我不会重新启动真实的服务器...在reload之后,我想看到在新日志文件上的新进程。) - stoqlt

0

我修改了之前的答案,因为Daniel Vérité指出,如果不使用logging_collector,则无法设置日志文件,log_filename选项将被忽略。

旋转是通过“复制-截断”完成的。也就是说,logrotate会复制文件,然后清空主日志文件。

在这种情况下,我认为你很幸运,因为服务器打开一个文件句柄来写入日志。这意味着你可以简单地重命名文件mv old_name.log new_name.log。PostgreSQL使用的文件句柄绑定到文件本身而不是名称。

这个解决方案的问题在于,服务器重新启动时,它将在旧名称下创建一个新的日志文件。你需要进行配置更改,以便在重新启动时继续写入同一位置。


你好Couling,感谢您的回答。为了更深入地描述情况,我的任务是在某些天内将日志记录设置为非常详细,然后再恢复原状。分区没有足够的空间来存储详细的日志。它有足够的空间来存储正常的日志,并进行文件轮换。因此,我必须以某种方式重定向日志文件。 - stoqlt
其次,如果我只设置log_filename,并且设置为相对文件名,则它确实会发生一些事情(在测试安装中进行了此研究)。也就是说,没有日志记录。因此,我认为仅设置log_filename确实具有某些(有缺陷的)效果。我已经开始调试pg_ctlcluster - stoqlt
log_filename 正式用于日志收集器。看起来您需要利用日志收集器或通过 syslog 推送日志。这将需要您重新启动服务器以启用,但不需要在随后更改日志目录时重新启动。如果您选择 syslog 选项,则需要阅读 rsyslog 的相关文档。 - Philip Couling
是的,我确实会使用rsyslog。但目前有600多个进程使用那该死的输出文件(fuser)。而且我应该能够将新进程的输出重定向到一个新的文件中。然而,我可能不得不放弃我的想法,尽管它听起来对我来说是一种非常自然的用法。所以我有点失望。 - stoqlt
旋转是通过“复制截断”完成的。也就是说,logrotate会复制文件,然后清空主日志文件。谢谢您的建议。我已经做到了。我定期复制文件,然后使用echo "" > file命令清空文件。可能会丢失一些行,但对于统计分析来说,结果还是可以接受的。 - stoqlt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接