日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

fluentdのformatを設定してみただけの日記

Macでfluentdを動かしてみようと思って動かしてみました。
dummerというダミーログを作ってくれるツールを利用しています。

github.com

動かしてみた流れ

  1. fluentd + dummer ( dummy log generator ) のインストール
  2. dummer ( 出力するログのフォーマット )設定
  3. fluentdのformat設定を無意味に頑張る
  4. 実行1
  5. fluentdにデフォルト(?)であるltsv設定をしてみる
  6. 所感

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は下記のページを参考にして作成

qiita.com


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で受け取って、どこかに書き込むとかやってみようと思います。