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 の両方をファイルにリダイレクトして、エラーとクエリを含む 1 つの .sql ファイルの結果をログに記録するには、次のようにします。

psql -f scriptname.sql &> logname.txt

内訳は次のとおりです。 -f (Frank Heikensからの回答で言及されているように)は、エラーをトリガーした行番号を表示するため、.sqlスクリプトを読み取るために < よりも使用するのに適したコマンドです。&> は、stdout と stderr の両方を後続のファイルに入れる Linux コマンド ライン トリックです。ログをエラーのみ (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 に答える
0

-f (およびその他の設定) を使用してpsqlにフィードします。

于 2012-07-12T16:11:40.617 に答える