2012-07-12 62 views
3

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

我已经用\ o和\ o打开和关闭标记来包围我的脚本,但是这只记录了查询的结果,这些结果告诉我什么都没有,也没有成功。我曾尝试使用Unix工具像这样管道调用的结果到PostgreSQL:

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

...没有成功。这种情况下的Filename.log完全是空的。

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

在Oracle中,我使用了SPOOL,在MySQL中我使用了TEE。这两种方法对我的需求都很好,但是\ o没有这个功能,也没有激活日志记录,因为这会记录到单个文件中,并且我希望根据哪个文件产生这些日志来分离日志。

任何帮助,将不胜感激。

编辑:我使用的版本是9.1

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

回答

6

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

既输出和错误重定向到一个文件记录只是一个.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口译作为错误的语法(不要问我为什么)。 T恤只允许输出到控制台和给定的文件。上述所有命令中的文件名可以是完整路径,可以包含〜(对于主目录)以及Linux可以解释为有效文件名和/或路径的任何其他内容。

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

+0

谢谢!这正是我正在寻找的答案和解释。再次感谢! – 2012-12-22 00:47:35

0

使用-f(和其他设置)来喂食psql

+0

虽然这是一个很好的做法(它的功能比<因为它提供了触发错误的行号),它仍然不会将错误输出放入文件中。我已经尝试过-L,-o,\ o和其他一些链接,但都没有达到预期的效果(错误输出和查询结果集中到一个文件中用于记录目的)。 – Adam 2012-07-12 16:42:31

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