Posted at 2012-12-04 00:21:22 under テクノロジ (by key)

いつものように走り書きスンマセン。環境はnginx 1.1.19-1ubuntu0.1, mongodb-10gen 2.2.1, td-agent 1.1.10.3-1です。

nginxの設定とポイント。

  • nginxでJSONっぽいフォーマットのログを定義
  • request_time, upstream_response_timeを定義してnginxの処理時間を出力
  • 時刻のフィールドはなんでも良いが、ここではISO8601文字列にしてある(JSONだし)

td-agent.confの設定とポイント。

  • 取り込みformatはjsonにする
  • ISO8601形式はそのまま読み込めないのでtime_formatでフォーマットを指定する 参考

これでモリモリとmongodbにログが記録されていきます。ほっときっぱなしでディスク溢れて死なせないよう気をつけなければ…。


2013/1/2 追記。

fluentdが lexical error: inside a string, '' occurs before a character which it may not. というエラーを吐いてました。 具体的には$requestに含まれる文字がparse出来ずにコケました。 ユーザ入力の環境変数を取り扱う際は、対象となる変数をエスケープしておく必要があります。 nginx一般の変数としては $request, $http_referer, $http_user_agent辺りでしょうか。

HttpSetMiscModule ( 説明 )のset_quote_json_strを使ってエスケープするのが簡単そうでしたが、locationディレクティブ内でしか使えないので採用できません。

これから対応策考えます…。


2013/1/2 夜追記。

結局性能計測ログを別に分けました。

  • 通常のアクセスログ → apache互換形式
  • 性能計測ログ → CSV形式

性能測定ログ nginx.conf:

log_format  performance  '$time_iso8601,"$request",$request_time,$upstream_response_time';

性能測定ログ td-agent.conf:

<source>
  type tail
  path /var/log/nginx/performance.log
  pos_file /var/log/fluent/nginx.performance_log.pos

  tag nginx.performance_log

  format csv
  keys time,request,response_time,upstream_response_time
  time_key time
  time_format %Y-%m-%dT%H:%M:%S%z
</source>

nginxからJSON形式で出力できればベストですが、標準モジュールでは対応できそうにない(上記問題が解決できそうにない)ため出力そのものを見送りました。 HttpSetMiscModuleを改造すれば解決できそうではあるんですけども、開発コスト、トラブルリスク、維持継続の面でやや厳しいかなと。

Tags: mongodb, nginx
blog comments powered by Disqus