機会的にformat作る事がそこまでないので、特に問題もないかもしれませんが
良い方法を模索中です・・・ネットを漁るとこうゆう記事があがってきます
■参考
fluentdのformat(正規表現)の作り方について試行錯誤中
Fluentdでparser用の正規表現を書く・試す
また正規表現を書く事になるので以下のページも参照
Fluentdでparser用の正規表現を書く・試すの方法だと
irbからうまくfluentdのモジュールが読めなかった・・・
今回はFluentdでparser用の正規表現を書く・試すを参考に
色々いじってみました。
rubyコードを用意
formatを評価してくれる簡単なrbを用意します
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'time'
require 'fluent/log'
require 'fluent/config'
require 'fluent/engine'
require 'fluent/parser'
$log ||= Fluent::Log.new
# debug
log = 'fluent.test.jp 192.168.33.1 - - [18/Jun/2014:12:24:15 +0000] "GET /page.html HTTP/1.1" 304 - 0 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"'
format = /^(?<date>[^ ]+) (?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*) [^ ]* "(?<agent>[^\"]*)"$/
time_format = ''
parser = Fluent::TextParser::RegexpParser.new(format, 'time_format' => time_format)
用意したコードを実行
上記rubyを実行するとlog
に突っ込んだ文字列を
format
変数で評価する処理を実行します。
成功すると下記のようなoutpugが返却されてきます
[root@localhost ruby]# ./bin/ruby fluentd_debug.rb
1403605137
{"date"=>"fluent.test.jp", "host"=>"192.168.33.1", "user"=>"-", "method"=>"GET", "path"=>"/page.html", "code"=>"304", "size"=>"-", "agent"=>"Mozilla/5.0 (Macintosh; Intel M\nac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"}
formatが問題なく評価されていれば、Perserでしっかり評価されたjsonが返却されてきます。
文字列に対して対応していないformatを指定してしまうとjsonは返却されてきません
[root@localhost ruby]# ./bin/ruby fluentd_debug.rb
<空白改行>
<空白改行>
[root@localhost ruby]#
今回formatしたlog
若干手を加えたapacheログ。
アクセスしに来たドメインを追加してリファラを取り除いてる
fluent.test.jp 192.168.33.1 - - [18/Jun/2014:12:24:15 +0000] "GET /page.html HTTP/1.1" 304 - 0 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
用意したカスタムフォーマット
/^(?<date>[^ ]+)(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*) [^ ]* "(?<agent>[^\"]*)"$/
ちなみにapacheのカスタムログはこんな感じでした
LogFormat "%v %h %l %u %t \"%r\" %>s %b %T \"%{User-Agent}i\"" vh
正規表現難しい・・・
ちなみに正規表現を評価してくれるサイトはこんなのもあります。勉強中です