Macでfluentdを動かしてみようと思って動かしてみました。
dummerというダミーログを作ってくれるツールを利用しています。
動かしてみた流れ
- fluentd + dummer ( dummy log generator ) のインストール
- dummer ( 出力するログのフォーマット )設定
- fluentdのformat設定を無意味に頑張る
- 実行1
- fluentdにデフォルト(?)であるltsv設定をしてみる
- 所感
1. fluentd + dummerのインストール
$gem install fluentd $gem install dummer
でおk
と思ってたら後で実行した時になんか言われた。
$dummer -c dummer.conf Could not find gem 'pry (>= 0) ruby' in any of the gem sources listed in your Gemfile or installed on this machine. Run `bundle install` to install missing gems.
( ゜д ゜)
こんな時 gem install したパッケージ指定して bundle installしたいんだけどどうすればいいのだろう・・・w
gem力?bundler力?とにかく力不足を感じつつ、仕方なく下記のように対応
※事前にgem install bundlerしてます
$sudo find / -name "dummer" /usr/local/bin/dummer /usr/local/Cellar/ruby/2.2.0/lib/ruby/gems/2.2.0/gems/dummer-0.3.5/bin/dummer /usr/local/Cellar/ruby/2.2.0/lib/ruby/gems/2.2.0/gems/dummer-0.3.5/lib/dummer $cd usr/local/Cellar/ruby/2.2.0/lib/ruby/gems/2.2.0/gems/dummer-0.3.5/| $bundler install
そして適当なディレクトリに移動後コマンド実行
$cd /path/to/workspace $fluentd --setup . Installed ./fluent.conf. $tree . ├── fluent.conf └── plugin
2. dummer ( ログのフォーマット )設定
次にdummer.confは下記のページを参考にして作成
dummer.conf
configure 'sample' do output "dummy.log" rate 500 delimiter "\t" labeled true field :id, type: :integer, countup: true, format: "%04d" field :time, type: :datetime, format: "[%Y-%m-%d %H:%M:%S]", random: false field :uri, type: :string, any: %w[/api/v1/people /api/v1/textdata] end
コピペです(ドン
この時点であるのは2ファイルと空ディレクトリの合わせて3つ
$tree . ├── dummer.conf ├── fluent.conf └── plugin 1 directory, 2 files
3. fluentd設定ltsv形式のformat設定を自らの手で無意味に頑張る
ここが今回頑張った(ハマった)ところです。
実は後でデフォルトでltsvがあると知って、これ無意味・・・いや、formatを知れる機会になったんだ!とポジティブシンキングを発揮したのは内緒です。
fluentdのformatは正規表現で書きます。
そんでもって、<>で囲むことでそこに名前を付けられるみたいです。
fluent.conf
<source> type tail format /^id:(?<id>.+)[\t]*time:\[(?<time>.+)\][\t]*uri:(?<uri>.*)$/ path ./dummy.log tag debug.noltsv time_format %Y-%m-%d %H:%M:%S </source> <match debug.**> # debug.ほげほげというタグがついた入力があったら標準出力する @type stdout </match>
この時、実際formatが合っているか確認するのだるいなぁ
と思ってましたが下記サイトにとても助けられました。
http://fluentular.herokuapp.com/parse?regexp=&input=&time_format=
4. 実行1
止めるの簡単にやりたかったので2つターミナル用意して片方でfluentd,
もう片方でdummerを実行しました。
ターミナル1
$fluentd -c fluent.conf 2015-04-14 23:17:48 +0900 [info]: reading config file path="fluent.conf" 2015-04-14 23:17:48 +0900 [info]: starting fluentd-0.12.7 2015-04-14 23:17:49 +0900 [info]: gem 'fluentd' version '0.12.7' 2015-04-14 23:17:49 +0900 [info]: using configuration file: <ROOT> <source> type tail format /^id:(?<id>.+)[\t]*time:\[(?<time>.+)\][\t]*uri:(?<uri>.*)$/ path ./dummy.log tag debug.noltsv time_format %Y-%m-%d %H:%M:%S </source> <match debug.**> @type stdout </match> </ROOT> 2015-04-14 23:17:49 +0900 [info]: adding match pattern="debug.**" type="stdout" 2015-04-14 23:17:49 +0900 [info]: adding source type="tail" 2015-04-14 23:17:49 +0900 [warn]: 'pos_file PATH' parameter is not set to a 'tail' source. 2015-04-14 23:17:49 +0900 [warn]: this parameter is highly recommended to save the position to resume tailing. 2015-04-14 23:17:49 +0900 [info]: following tail of ./dummy.log
ターミナル2
$dummer -c dummer.conf.rb
こうすると下記のようにターミナル1の方にパースされたあとの出力が出てきます。
2015-04-14 23:19:13 +0900 debug.noltsv: {"id":"0000\t","uri":"/api/v1/people"} 2015-04-14 23:19:13 +0900 debug.noltsv: {"id":"0001\t","uri":"/api/v1/textdata"} 2015-04-14 23:19:13 +0900 debug.noltsv: {"id":"0002\t","uri":"/api/v1/textdata"} 2015-04-14 23:19:13 +0900 debug.noltsv: {"id":"0003\t","uri":"/api/v1/people"} 2015-04-14 23:19:13 +0900 debug.noltsv: {"id":"0004\t","uri":"/api/v1/textdata"}
5. fluentdにデフォルト(?)であるltsv設定をしてみる
でもこんなformatいらないんです←
<source> type tail format ltsv # tailする対象ファイル名変えました。 path ./dummy-ltsv.log tag debug.ltsv # time_formatに 「[」や「]」を使った場合ダブルクオートでくくらないとfluentdが起動しませんでした。 time_format "[%Y-%m-%d %H:%M:%S]" </source> <match debug.**> @type stdout </match>
formatにltsvと書いてあげればあの作業は全て無に帰します。
実行結果は何も変わらないので割愛します。
6. 所感
fluentdといかストリーム処理楽しいですね。
フォーマットの指定自体は色々あるみたいです。
本家で紹介されていたので、参考になりそうです。
http://docs.fluentd.org/articles/in_taildocs.fluentd.org
今度はストリームをfluentdで受け取って、どこかに書き込むとかやってみようと思います。