Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
11
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@key

fluentdで出力したログの一部を文字列から数値に変換する

以前、nginxのログをLTSV形式で出力して、fluentd経由でMongoDBに保存するの作業を実施したとき、ログの値がすべて文字列で保存されることに気付きました。

例えば、

  • status
  • bytes_sent
  • body_bytes_sent
  • request_time
  • upstream_response_time

は、ストレージの省スペース化や検索インデクスのためにintまたはfloatで保持するのが望ましいです。

HTTPステータスコードで正常なリクエストのみを対象とするには200番台に絞り込む必要があり、MongoDB上では次のようなクエリで検索することが出来ます。

> db.nginx_access.find({status: {"$gte": 200, "$lt": 300}})

しかし、文字列で保存されている場合は大小で比較することが出来ないので、文字列の先頭一致で検索する必要が出てきて面倒なことこの上ありません(クエリは割愛)。

fluentdにプラグインを追加して型変換を行うことで回避できます。型変換にはfluent-plugin-typecastを使います。td-agent利用時にfluent-plugin-typecastをインストールするには次のようにします。

/usr/lib/fluent/ruby/bin/fluent-gem install fluent-plugin-typecast

fluent-plugin-typecastをインストールすると、fluentdのtypetypecastパラメタが使えるようになります。item_typesに、ログのキーと変換後の型をコロンでつなぎ、複数ある場合にはカンマで区切って列挙します。

先のパラメタをinteger, floatに変換するには次のようにします。

<match nginx.access>
  type typecast
  item_types size:integer,status:integer,request_time:float,upstream_response_time:float,bytes_send:integer,body_bytes_send:integer
  tag filtered.nginx.access
</match>

変換後のログはfiltered.nginx.accessというタグをつけて処理します。

<match filtered.nginx.access>
  type copy

  <store>
    type mongo
    host 127.0.0.1
    database server-log
    collection nginx_access_log
  </store>
</match>

出力されたログを確認してみます。

{
  "_id" : ObjectId("53199b97b24cd85a6100004e"),
  "remote_addr" : "xxx.xxx.xxx.xxx",
  "request_method" : "GET",
  "request_length" : "1607",  // あっ
  "request_uri" : "/ajax/mypage",
  "https" : "",
  "uri" : "/ajax/mypage",
  "query_string" : "",
  "status" : 200,
  "bytes_sent" : 480,
  "body_bytes_sent" : 95,
  "referer" : "",
  "useragent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36",
  "forwardedfor" : "xxx.xxx.xxx.xxx",
  "request_time" : 0.087,
  "upstream_response_time" : 0.087,
  "time" : ISODate("2014-03-07T10:11:34Z")
}

statusrequest_timeが数値型になってますね!!!

めでたしめでたし。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
11
Help us understand the problem. What are the problem?