.sql脚本的PostgreSQL查询/错误日志记录

问题描述 投票:4回答:3

问题是:我需要知道如何从执行的.sql脚本获取所有PostgreSQL输出以记录到文件,包括错误和查询结果。

我已经使用\ o和\ o打开和关闭标签包围了我的脚本,但这只记录了查询的结果,这告诉我什么做不成功。我已经尝试使用Unix工具将调用结果传递给PostgreSQL,如下所示:

    $~: psql < filename.sql | tee &> filename.log

......没有成功。在这种情况下,Filename.log最终完全为空。

我不想激活通用日志记录,因为我只关心我编写的脚本的成功/失败,并记录下来以备将来参考。

在Oracle中,我使用了SPOOL,在MySQL中我使用了TEE。这两个都足以满足我的需求,但是\ o没有这个功能,也没有激活日志记录,因为这会记录到单个文件,我希望根据哪个文件导致这些日志分离我的日志。

任何帮助,将不胜感激。

编辑:我使用的版本是9.1

编辑:我遇到的问题是使用-f和使用<执行.sql文件给我基本相同的结果;它不记录错误,只记录查询结果。我需要以某种方式获取stderr(如果这是使用的)将其消息打印到文件而不仅仅是命令行,使得文件基本上看起来与运行文件的命令行结果相同,查询结果和错误混合我需要这样做的原因是因为它使调试.sql文件变得更加容易,它允许我保留目标记录,同时避免通用错误记录。

sql postgresql logging tee spool
3个回答
7
投票

我在命令行上使用了错误的重定向语法。虽然在我看来这不是一个理想的解决方案(我必须记住修改我曾经运行的任何命令以将输出重定向到文件),但它是有效的,这就是我所关心的。

要将stdout和stderr重定向到文件以记录包含错误和查询的一个.sql文件的结果,可以执行以下操作:

psql -f scriptname.sql &> logname.txt

以下是细分:-f(在Frank Heikens的答案中提到)是一个比<读取.sql脚本更好的命令,因为它显示了触发错误的行号。 &>是一个Linux命令行技巧,它将stdout和stderr放入随后的文件中。要将日志限制为只是错误(只是sdterr输出),只需使用2>而不是&>。不需要管道,因为两个流都到达同一个地方。

但是,您会注意到上面的命令获取命令的所有输出并将其放入文件中,因此您在命令行中看不到任何输出。这不是调试.sql脚本的理想选择,因此可以使用以下命令:

psql -f scriptname.sql 2>&1 | tee logname.txt

这里的细分是2>&1是&>的长形式,但是当使用管道时,2>&1避免BASH将语法解释为错误(不要问我为什么)。 tee只允许输出到控制台和给定文件。所有上述命令中的文件名可以是完整路径,可以包括〜(对于主目录),以及Linux可以解释为有效文件名和/或路径的任何其他内容。

尽管如此,这个解决方案并不理想,因为它是我需要记录的.sql脚本的外部。但是,这种方法确实有效。我认为PostgreSQL在Linux中的历史部分归咎于依赖命令行工具来做这类事情。


1
投票

这也有效 - 使用-a -b和-e选项进行“详细日志记录:”

psql -f scriptname.sql -a -b -e &> logname.text

psql --help显示:

Input and output options:
  -a, --echo-all           echo all input from script
  -b, --echo-errors        echo failed commands
  -e, --echo-queries       echo commands sent to server

0
投票

使用-f(和其他设置)来提供psql

© www.soinside.com 2019 - 2024. All rights reserved.