デバッグのためにnginxログに変数を出力する方法


83

nginxをテストしていて、変数をログファイルに出力したい。どのようにそれを行うことができますか、どのログファイルに行きますか(アクセスまたはエラー)。

回答:


143

ヘッダーを介してnginx変数値を送信できます。開発に便利です。

add_header X-uri "$uri";

ブラウザの応答ヘッダーに表示されます:

X-uri:/index.php

ローカル開発中にこれを行うことがあります。

また、サブセクションが実行されているかどうかを伝えるのにも便利です。句の中にそれを振りかけるだけで、それらが使用されているかどうかを確認できます。

location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ {
    add_header X-debug-message "A static file was served" always;
    ...
}

location ~ \.php$ {
    add_header X-debug-message "A php file was used" always;
    ...
}

したがって、http://www.example.com/index.phpのようなURLにアクセスすると、後者のヘッダーがトリガーされ、http://www.example.com/img/my-ducky.pngにアクセスすると、前者のヘッダーがトリガーされます。


29
成功したリクエストでのみadd_header動作することに注意してください。ドキュメントには、コード200、204、301、302、または304の応答にのみ適用できると記載されています。したがって、HTTPエラーのデバッグには使用できません。
ジョンWHスミス

31
@JohnWHSmith:maratがこの回答で述べたようにバージョン1.7.5の時点で、nginx は、応答コードに関係なく、ヘッダーを返す「always」パラメーターを追加しましたadd_header。したがって、たとえば、add_header X-debug-message "A php file was used" always;エラーコード500でも機能します。
ユビリオ

6
これは質問にまったく答えません。男は、クライアントではなくログファイルにログを記録したいと考えています。
アバマンダー

37

HTTP応答として単純な文字列を返すことができます。

location /
{
    return 200 $document_root;
}

1
2つの変数値を返したい場合はどうしますか?
-BringBackCommodore64

その場所に移動すると、すぐにブラウザーの「名前を付けて保存」ダイアログが開きます(Opera、Chromiumでテスト済み)。まったく応答しません。
-BringBackCommodore64

@ BringBackCommodore64 text / html Content-Typeヘッダーを追加すると役立つ場合があります。
ビット単位の

Postmanを使用すると、追加のヘッダーなしで機能します。ありがとう!
aexl

19

log_format興味のある変数を記録するディレクティブを使用して、カスタムアクセスログ形式を設定できます。


2
おかげで、私は1つの変数を単独で出力する簡単な方法はないと思いますか?
ルラララ

@lulalala知らない。
mgorven

ディレクティブでログレベルを設定することも可能であるerror_logためにdebugあなたが実行されている変数とそのブロックの値を見ることができます。例error_log file.log debug
ビクターア

1
空の変数は-ログのように表示されますが、nginxコードでは本当に空であることに注意してください-。いつでも確認しないでください。これは時々ユーザーを混乱させます。
日比田

6

もう1つのオプションは、nginxをビルドするときにechoモジュールを含めるか、拡張機能(echoなど)がバンドルされたnginxであるOpenRestyをインストールすることです。

次に、次のようなステートメントを単に構成に振りかけることができます。

echo "args: $args"

2
これを試みると、サーバー上のプレーンテキストファイルにエコー出力され、実際のページの出力が中断されます。
JaredMcAteer

echo_log開発中のディレクティブがあります。
ガジュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.