2012-07-12 83 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