10
10

More than 5 years have passed since last update.

fluentdでformatを作る時

Posted at

機会的にformat作る事がそこまでないので、特に問題もないかもしれませんが
良い方法を模索中です・・・ネットを漁るとこうゆう記事があがってきます

■参考
fluentdのformat(正規表現)の作り方について試行錯誤中
Fluentdでparser用の正規表現を書く・試す

また正規表現を書く事になるので以下のページも参照

Fluentdでparser用の正規表現を書く・試すの方法だと
irbからうまくfluentdのモジュールが読めなかった・・・

今回はFluentdでparser用の正規表現を書く・試すを参考に
色々いじってみました。

rubyコードを用意

formatを評価してくれる簡単なrbを用意します

fluentd_debug.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

正規表現難しい・・・
ちなみに正規表現を評価してくれるサイトはこんなのもあります。勉強中です

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10