NginnxログをJSON形式に変更しました。

6272 ワード

Nginxログはデフォルトでは普通のテキストのフォーマットです。例えば、次の行はNginxのアクセスログです。
10.88.122.105 - - [02/Dec/2017:09:15:04 +0800] "GET /js/pagination.js HTTP/1.1" 304 0 "http://10.88.105.20:8063/stockrecommand.html" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)" "-" 0.000
Elastic Stockのログプラットフォームを利用して、Ngixを展示するログを収集するために、NgixのログをJsonのフォーマットに変更することができます。修正後のJsonログフォーマットは以下の通りです。
{ "@timestamp": "12/Dec/2017:14:30:40 +0800", "remote_addr": "10.88.122.108", "referer": "-", "request": "GET / HTTP/1.1", "status": 304, "bytes":0, "agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", "x_forwarded": "-", "up_addr": "-","up_host": "-","up_resp_time": "-","request_time": "0.000" }
Nginxのログフォーマットをjsonに変更するためには、Ngixのプロファイルを修正する必要があります。筆者のNgixのプロファイルは/usr/local/nginx/conf/nginx.com nfです。
http {
    include       mime.types;
    default_type  application/octet-stream;
    charset  utf-8;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $request_time';

    log_format log_json '{ "@timestamp": "$time_local", '
'"remote_addr": "$remote_addr", '
'"referer": "$http_referer", '
'"request": "$request", '
'"status": $status, '
'"bytes": $body_bytes_sent, '
'"agent": "$http_user_agent", '
'"x_forwarded": "$http_x_forwarded_for", '
'"up_addr": "$upstream_addr",'
'"up_host": "$upstream_http_host",'
'"up_resp_time": "$upstream_response_time",'
'"request_time": "$request_time"'
' }';

    access_log  logs/access.log log_json;

    (    )
}
Nginxのプロファイルnginx.confでは、2つのログフォーマットを定義している。mainlog_jsonと、ここでは、mainは普通のテキスト形式であり、log_jsonはjson形式である。log_jsonは実は手作りでjson文字列を作っています。jsonのログフォーマットを定義したら、access logsをjson形式に指定できます。
access_log  logs/access.log log_json;
Nginnxの設定を変更して、Ngixを再起動すると、json形式のログが表示され、Ngixを再起動することができます。
nginx -s reload
参考資料
  • http://www.ttlsa.com/nginx/nginx-log-records-in-json-format/
  • http://www.iteye.com/topic/1138111