2012年7月20日金曜日

fluentdのインストール方法と初回設定方法

■概要
rubyとgemのインストールを行っていることが前提となります
過去に以下の記事を作成しているので、未インストールの場合は参考にしてみてください
http://kakakikikeke.blogspot.com/2012/04/centos56ruby.html
また、今回はapacheのアクセスログをfluentで出力するようにするので、apacheもインストールしておいてください

■インストール&サンプル実行
では、fluentのインストールの説明を行います
(コマンドを並べているだけですがw)

yum -y install gcc
gem install fluentd
fluentd --setup /usr/local/fluent/
emacs /usr/local/fluent/fluent.conf
以下を記載します

<source>
  type tail
  format apache
  path /var/log/httpd/access_log
  tag apache.access
</source>

<match apache.access>
  type file
  path /var/log/fluent/access_log
</match>

fluentd --config /usr/local/fluent/fluent.conf -vv &
tailf /var/log/fluent/access_log.*
でapacheのアクセスログがfluentを経由してこちらに出力されているはずです

■備忘録(P.S 20130705)
fluentd --setup
するとデフォルトの /etc/fluent/fluent.conf に設定ファイルを置いてくれます
-c or --config でいちいちパスを指定しなくて済みます

ログの変換例
上記のapacheの設定だと以下のように変換してくれました、確かに読みやすい
hostname - kakakikikeke [05/Jul/2013:09:48:30 +0900] "GET /js/bootstrap.min.js HTTP/1.0" 404 294 "http://referer-server/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0"
↓
2013-07-05T09:48:30+09:00       apache.access   {"host":"hostname","user":"kakakikikeke","method":"GET","path":"/js/bootstrap.min.js","code":"404","size":"294","referer":"http://referer-server/","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0"}

各種設定ファイルのタグの説明
  • source・・・対象のログを指定
  • match・・・sourceのtagとマッチしたログを具体的にどうするか記述、typeでfailを指定するとローカルのファイルにforwardを指定するとserverタグをmatchタグ内で使用することでサーバに転送可能
  • server・・・転送先のサーバ情報を記載
  • store・・・これもmatchタグ内で使用するログの保存をローカル、転送と複数設けたい場合に使用
  • その他・・・http://docs.fluentd.org/articles/out_forward

formatの設定
今回は「apache」というすでにfluentdに実装されているformatを使用しました
これは転送するログのフォーマットがデフォルトのapacheのログフォーマットのままだったので使用出来ました

例えばx-forwarded-forなどをログの出力に追加したりするとapacheのformatは使えなくなります
その場合は自分でformatを作成する必要があります
以下が参考になるかと思いますが、基本は正規表現を使って解析し、独自のタグを付けることでformatを作成します
http://d.hatena.ne.jp/tagomoris/20120715/1342368392

また、formatを独自で作成した場合は「time format」も必ず定義しなければいけなくなるので注意してください
time format を定義しないと「argument out of range」というエラーが出てログが転送されません
サンプルとして独自で作成したformatとtime formatを記載しておきます
format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")? "(?<x-forwarded-for>[^ ]*)"$/
time_format %d/%b/%Y:%H:%M:%S %z
上記サンプルの「[^ ]*」は半角スペースでない文字列の続きを表す正規表現です
「[^\"]*」はダブルクオーテーション以外の連続した文字列を表しています
個人的には「/^(<?<log1>.*) (<?<log1>.*) (<?<log2>.*)$/」みたいな感じでとりあえずスペースで区切って何個か正規表現を作成し実際に転送してみた上でどんなJSONになるか確認しながらやっていくのが簡単にできる方法かなと思います

0 件のコメント:

コメントを投稿