トップページに戻る
ひとつ前に戻る

ここにある td-agent.conf の説明です

  • Examples: 以下を説明します
  • Examples: より上は、デフォルトの設定なので、 td-agent.conf のコメントにあるリンクを参照してください。
  • 以下、上から順に説明します。
  • 上の行から流れ作業で Piwik トラッカーのログを elasticsearch にわかる形式に変換し、最後にストアするようにしています。

Piwik サーバーの Web アクセスログを拾う

<source>
  type tail
  format apache
  time_format %d/%b/%Y:%H:%M:%S %z
  pos_file /var/log/td-agent/access_log.pos
  path /var/log/httpd/access_log
  tag piwiktracker.apache.access
</source>
  • format apache で、 tail する対象は apache combined ログとなります。なお、独自形式は、正規表現で記述します。
  • Piwik サーバーの Web アクセスログ(/var/log/httpd/access_log)を td-agent でずっと tail します。
  • あたらしい行が追加されたら、行ごとに filter piwiktracker.apache.access を呼び出します。

filter piwiktracker.apache.access Piwik トラッカーログだけを抽出

<filter piwiktracker.apache.access>
    type grep
    regexp1 path /piwik/piwik\.php\?action_name=.*\&idsite=\d+
</filter>
  • <source> で取得した Web アクセスログを regexp1 の条件に一致するときだけ match piwiktracker.apache.access を呼び出します。
  • Piwik トラッカーログだけを抽出他は捨てます。
  • elasticsearch にうまくストアされないときは regexp1 の条件が /var/log/httpd/access_log とマッチするかどうか調べてください
    • わからなければ regexp1 path /piwik\.php\?action_name=.*\&idsite=\d+ としてみます。

match piwiktracker.apache.access Piwik トラッカーログから各要素に分解します

<match piwiktracker.apache.access>
    type record_reformer
    tag piwiktracker.apache.access.decode
    action_name ${path[/piwik\.php\?action_name=([^\&]+)/,1]}
    idsite ${path[/piwik\.php\?action_name=.*\&idsite=(\d+)/,1]}
    rec ${path[/piwik\.php\?action_name=.*\&rec=(\d+)/,1]}
    r ${path[/piwik\.php\?action_name=.*\&r=(\d+)/,1]}
    h ${path[/piwik\.php\?action_name=.*\&h=(\d+)/,1]}
    m ${path[/piwik\.php\?action_name=.*\&m=(\d+)/,1]}
    s ${path[/piwik\.php\?action_name=.*\&s=(\d+)/,1]}
    url ${path[/piwik\.php\?action_name=.*\&url=([^\&]+)/,1]}
    urlref ${path[/piwik\.php\?action_name=.*\&urlref=([^\&]+)/,1]}
    piwikid ${path[/piwik\.php\?action_name=.*\&_id=([a-z\d]+)/,1]}
    idts ${path[/piwik\.php\?action_name=.*\&_idts=([\d]+)/,1] == "1" ? "true" : "false" }
    idvc ${path[/piwik\.php\?action_name=.*\&_idvc=(\d)/,1] == "1" ? "true" : "false" }
    idn ${path[/piwik\.php\?action_name=.*\&_idn=(\d)/,1] == "1" ? "true" : "false" }
    refts ${path[/piwik\.php\?action_name=.*\&_refts=(\d+)/,1]}
    viewts ${path[/piwik\.php\?action_name=.*\&_viewts=(\d+)/,1]}
    ref ${path[/piwik\.php\?action_name=.*\&_ref=([^\&]+)/,1]}
    send_image ${path[/piwik\.php\?action_name=.*\&send_image=(\d+)/,1]}
    pdf ${path[/piwik\.php\?action_name=.*\&pdf=(\d+)/,1] == "1" ? "true" : "false" }
    qt ${path[/piwik\.php\?action_name=.*\&qt=(\d+)/,1] == "1" ? "true" : "false" }
    realp ${path[/piwik\.php\?action_name=.*\&realp=(\d+)/,1] == "1" ? "true" : "false" }
    wma ${path[/piwik\.php\?action_name=.*\&wma=(\d+)/,1] == "1" ? "true" : "false" }
    dir ${path[/piwik\.php\?action_name=.*\&dir=(\d+)/,1] == "1" ? "true" : "false" }
    fla ${path[/piwik\.php\?action_name=.*\&fla=(\d+)/,1] == "1" ? "true" : "false" }
    java ${path[/piwik\.php\?action_name=.*\&java=(\d+)/,1] == "1" ? "true" : "false" }
    gears ${path[/piwik\.php\?action_name=.*\&gears=(\d+)/,1] == "1" ? "true" : "false" }
    ag ${path[/piwik\.php\?action_name=.*\&ag=(\d+)/,1] == "1" ? "true" : "false" }
    cookie ${path[/piwik\.php\?action_name=.*\&cookie=(\d+)/,1] == "1" ? "true" : "false" }
    res ${path[/piwik\.php\?action_name=.*\&res=([\d\.]+x[\d+\.]+)/,1]}
    gt_ms ${path[/piwik\.php\?action_name=.*\&gt_ms=(\d+)/,1]}
</match>
  • 一行の Piwik トラッカーログを分解し、td-agent の中の変数に格納し、 filter piwiktracker.apache.access.decode に処理を移します。
  • Ruby の特殊な正規表現については、 instance method String#[] を参考にしてください。
  • 分解される各変数が何を意味するかは Piwik トラッカーが追加で記録します を参照してください。

filter piwiktracker.apache.access.decode IP アドレスから緯度経度を算出します

<filter piwiktracker.apache.access.decode>
  type geoip
  geoip_lookup_key host
  skip_adding_null_record  true
  geoip_database "/usr/share/GeoIP/GeoLiteCity.dat"
  flush_interval 1s
  <record>
    country ${country_code["host"]}
    location ${latitude['host']},${longitude["host"]}
    country_code3 ${country_code3["host"]}
    country ${country_code["host"]}
    country_name ${country_name["host"]}
    city ${city["host"]}
  </record>
</filter>
  • fluent-plugin-geoip プラグインで host 変数に記録されている閲覧者 IP アドレスから緯度経度を出し、 match piwiktracker.apache.access.decode に処理を移します。
  • skip_adding_null_record true でたとえば city がない location がない ときは city 変数自体が定義されません(elasticsearch 上も そのアクセスだけ 変数自体が存在しないことになります)。
    • 例えば location はローカル IP のときは定義されません。
  • くわしくは fluent-plugin-geoip を参照してください。

match piwiktracker.apache.access.decode URL エンコードを読めるようにします

<match piwiktracker.apache.access.decode>
    type  uri_decode
    tag   piwiktracker.apache.access.store
    #tag debug.${tag}
    key_names action_name,ref,url,urlref
</match>
  • urlencode されている変数は、 action_name,ref,url,urlref の 4 つというわけです。
  • decode したら、 piwiktracker.apache.access.store に処理を移します。

piwiktracker.apache.access.store elasticsearch に値をストアします

<match piwiktracker.apache.access.store>
    type copy
    <store>
        type elasticsearch
        type_name access_log
        host 127.0.0.1
        port 9200
        logstash_format true
        logstash_prefix apache-log
        logstash_dateformat %Y%m%d
        include_tag_key true
        tag_key @log_name
        flush_interval 10s
    </store>
#    <store>
#        type file
#        path /tmp/fluentd-debug.log
#    </store>
</match>
  • type elasticsearch 以下は elasticsearch の mapping 定義と密接にかかわります。 piwik-template.json 中で piwiktracker.apache.access.store を検索すると、どう関係しているのがわかります。
  • 各パラメーターについては https://github.com/uken/fluent-plugin-elasticsearch#configuration を参照してください。
  • # を消去すると、 elasticsearch にストアされるデータが /tmp/fluentd-debug.log* ファイルにも書き込まれます。