web-dev-qa-db-ja.com

nginxからJSONログを生成する方法は?

私はnginxからJSONログを生成しようとしています。

this one のような解決策を知っていますが、ログに記録したいフィールドには、適切にエスケープする必要があるユーザー生成入力(HTTPヘッダーなど)が含まれています。

私は2011年10月から2008年5月までのnginx changelogエントリを知っています:

*) Change: now the 0x7F-0x1F characters are escaped as \xXX in an
   access_log.
*) Change: now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX
   in an access_log.

しかし、これは\xXXJSON文字列では無効 です。

また、 HttpSetMiscModule モジュールにset_quote_json_strディレクティブですが、これは単に\x22助けにならない文字列の周り。

他のソリューションがnginxからJSON形式でログインするためのアイデアはありますか?

49
Jules Olléon

最後に、モジュールなしでVanilla nginxでこれを行う良い方法があるように見えます。定義するだけです:

log_format json_combined escape=json
  '{'
    '"time_local":"$time_local",'
    '"remote_addr":"$remote_addr",'
    '"remote_user":"$remote_user",'
    '"request":"$request",'
    '"status": "$status",'
    '"body_bytes_sent":"$body_bytes_sent",'
    '"request_time":"$request_time",'
    '"http_referrer":"$http_referer",'
    '"http_user_agent":"$http_user_agent"'
  '}';

escape = jsonはnginx 1.11.8で追加されたことに注意してください。 http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format

92
pva

あなたはそれを使用しようとすることができます https://github.com/jiaz/nginx-http-json-log -Nginx用の追加モジュール。

7
ctrlok

あなたが使用しようとすることができます:

PS: ifパラメーター(1.7.0)は条件付きログを有効にします 。条件が「0」または空の文字列と評価された場合、リクエストはログに記録されません。

map $status $http_referer{
    ~\xXX  0;
    default 1;
}

access_log /path/to/access.log combined if=$http_referer;

https://github.com/zaach/jsonlint などのツールを使用してJSONデータを確認することをお勧めします。新しいログ形式の出力をテストし、それが実際の適切なJSONであることを確認できます。

1