私は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.
しかし、これは\xXX
は JSON文字列では無効 です。
また、 HttpSetMiscModule モジュールにset_quote_json_str
ディレクティブですが、これは単に\x22
助けにならない文字列の周り。
他のソリューションがnginxからJSON形式でログインするためのアイデアはありますか?
最後に、モジュールなしで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
あなたはそれを使用しようとすることができます https://github.com/jiaz/nginx-http-json-log -Nginx用の追加モジュール。
あなたが使用しようとすることができます:
nginxの追加モジュール nginx-http-json-log
nginx-json-logformat で行われているように任意の言語を使用し、/ etc/nginx/conf.d/ json_log.conf の例を使用します
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であることを確認できます。