6

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

4

3 回答 3

12

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

要将 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 上的历史部分归咎于依赖命令行工具来完成这类事情。

于 2012-07-14T03:45:44.043 回答
2

这也有效 - 为“详细日志记录”使用 -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
于 2017-03-15T20:02:29.713 回答
0

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

于 2012-07-12T16:11:40.617 回答