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

时间:2012-07-12 15:43:25

标签: sql postgresql logging tee spool

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

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

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

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

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

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

任何帮助都将不胜感激。

编辑:我使用的版本是9.1

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

3 个答案:

答案 0 :(得分:7)

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

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

psql -f scriptname.sql &> logname.txt

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

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

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

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

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