PostgreSQL查询/错误记录对于.sql脚本

8

问题在于:我需要知道如何将执行的.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文件更容易,并且允许我保持有针对性的记录,同时避免通用错误日志记录。

3个回答

12

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

为了将stdout和stderr都重定向到一个文件以记录一个.sql文件中的结果(包括错误和查询),可以执行以下操作:

psql -f scriptname.sql &> logname.txt

以下是细节:-f(如Frank Heikens的答案所示)是读取.sql脚本时比<更好的命令,因为它显示触发错误的行号。&>是Linux命令行技巧,它将标准输出和标准错误输出都放入后面的文件中。要仅记录错误(即仅记录标准错误输出),只需使用2>而不是&>。由于两个流都进入同一位置,因此无需使用管道。

但是您会注意到,上述命令将所有输出都放入文件中,因此在命令行中看不到任何输出。这对于调试.sql脚本不理想,因此可以改用以下命令:

psql -f scriptname.sql 2>&1 | tee logname.txt
这里的意思是,2>&1 是 &> 的长形式,但在使用管道时,2>&1 可以避免BASH将语法解释为错误(不要问我为什么)。tee 命令允许输出同时传输到控制台和指定的文件。上述所有命令中的文件名可以是完整路径,并且可以包括~(表示家目录)和Linux可解释为有效文件名和/或路径的任何其他内容。
然而,这种解决方案并不理想,因为它是外部于我需要记录日志的 .sql 脚本。不过,这种方法确实有效。我认为 PostgreSQL 与 Linux 的历史部分原因是依赖命令行工具来完成这种事情。

谢谢!这正是我在寻找的答案,并附有解释。再次感谢! - David S

5
这也适用 - 使用"-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


虽然这是一个好的实践(它比<更全面,因为它提供了触发错误的行号),但它仍然没有将错误输出放入文件中。我尝试过-L、-o、\o以及链接中的其他一些选项,但都没有产生期望的效果(将错误输出和查询结果汇集到一个文件中以进行日志记录)。 - Adam

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