td-agentのインストール

http://dev.classmethod.jp/cloud/td-agent2-amazon-linux/

上記ページに沿って行った。CentOSでも同じ手順。

手動で実行するならば以下の通りに実行する

yum.repositoryの追加

[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0

td-agentのインストール

yum install td-agent

td-agentのバージョンとOSの関係

CentOS 6td-agent 0.10.55
CentOS 7td-agent 0.12.12
AmazonLinux 15.09td-agent 0.12.12

設定ファイル

sourceで入力を定義して、matchで処理を行う。matchで複数の処理はできないので別々のプラグインで複数処理をしたい場合はtagをつける。

<match apache.access>
  type file
  path /var/tmp/apache_all.log
  tag next.apache.access
</match>
<match next.apache.access>
  type file
  path /var/tmp/apache_all2.log
</match>

設定ファイルのインクルード

include conf.d/*.conf

httpポート8888で待ち受け

# http://localhost:8888/<tag>?json=<json>
<source>
  type http
  port 8888
</source>

type forwardの場合はhttpアクセスはできないがそのポートで待ち受けすることになる。

設定ファイルで環境変数を使う例

--use-v1-configを付けて起動する

match raw.dummy>

 type file
 path "/var/tmp/#{ENV['HOME']}/test.log"

/match>

HOMEはtd-agentの実行ユーザーのディレクトリとなる。デフォルトでは/var/lib/td-agent/

設定をDSLで記述する

['hoge','fuga'].each do |i|
  match ("foo#{i}.#{ENV['HOSTNAME']}") {
    type :stdout
  }
end
td-agent -c /etc/td-agent/test.rb --dry-run
 <match foohoge.**>
   type stdout
 </match>
 <match foofuga.**>
   type stdout
 </match>

type(subtype)の説明

type名簡単な概要
null転送せずに捨てる
forestタグ名を置換変数化できるので、まとめて同じような設定をしたいときに使う
rewrite_tag_filter正規表現でタグづけできる
record_modifier新たに属性を追加できる。たとえばApacheログにホスト名を付与したりとか

ローカルのファイルを転送する。

<source>
  type tail
  format apache
  path /var/log/httpd/*_access_log
  tag apache.access
  pos_file /tmp/fluentd-apache.pos
</source>
<match apache.access>
       type s3
       aws_key_id 
       aws_sec_key 
       s3_bucket bucket_name
       s3_endpoint bucket_name.s3-website-ap-northeast-1.amazonaws.com
       path logs/
       buffer_path /var/tmp/fluentd
       time_slice_format %Y%m%d/%H_apache.log
       time_slice_wait 30m
       flush_interval 60s // この感覚でS3にputするので一日1440リクエストで危うくクラウド破産!
</match>
<source>
  type   tail
  path   /var/log/httpd/error_log
  format apache_error
  tag    apache.error
  pos_file /tmp/apache_error.pos
</source>
# 送り先を Fluentd の標準ログへ出力します
<match apache.error>
  type stdout
</match>
<source>
  type tail
  path /var/log/httpd/access_log
  pos_file /var/tmp/access_log.pos
  tag httpd
  format none
</source>
# 送り先を Fluentd の標準ログへ出力します
<match httpd>
  type stdout
</match>

プラグイン

プラグイン一覧

プラグイン名
copy転送やファイル保存など複数に保存したいときに
rewrite_tag_filter条件に応じてタグを書き換えることができる
forest同じようなタグに一括で適用したい場合に非常に便利
fluent-plugin-mapレコードの内容書き換え
fluent-plugin-record-reformer同じくレコード書き換え

日付付きファイル名に対応!tail_exプラグイン

<source>
  type tail_ex
  format none
  path /var/tmp/%Y%m%d.log
  tag tail_ex_test
  pos_file /tmp/td-agent/tail_ex_test.pos
  refresh_interval 10
</source>

上記の例だと20150831.logが監視ファイル名となる。

format

主要フォーマット

フォーマット名入力文字例備考
none入力そのまま
none_with_hostname入力文字列にhost情報
ltsvdomain:example.comラベル付きのTSV
apache2apacheのcombinedカスタマイズしてたらNG
apache.errorapacheのerrorログカスタマイズしてたらNG
csv,tsvexample.com,/hogekeys domain,pathなどとキーを別個定義

フィルタリング正規表現

formatを自分で作る場合rubyの正規表現の知識が必須。

Apacheの場合(combined以外)

日付の部分の正規表現がとてもめんどくさい。\[(?<time>[^\]]+)\]がその正規表現。フォーマットも指定しないとだめ。

format /^(?<host>[^ ]+) [^ ]+ [^ ]+ \[(?<time>[^\]]+)\] (?<message>[^ ]+).*$/
time_format %d/%b/%Y:%T %z 

参考サイト

http://diary.tachibanakikaku.com/2013/12/fluentdformat.html

手元で正規表現テスト

#!/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 = ''
format = //
time_format = ''
parser = Fluent::TextParser::RegexpParser.new(format, 'time_format' => time_format)
puts parser.call(log)
/usr/lib64/fluent/ruby/bin/ruby fluenttest.ruby

テスト実行サイト

Fluentular: a Fluentd regular expression editor http://fluentular.herokuapp.com/

実行

トラブルシューティング

  1. 読み込みファイルの指定にワイルドカードが使えないわかがない!→後で修正
  2. 読み込みにはtd-agentグループ権限が付与されていないとエラー
  3. combinedがパターンマッチされない・・これはカスタマイズしている可能性もあるので今後調査。→カスタマイズしてたら取り込まれない!

Tips

http://y-ken.hatenablog.com/entry/fluentd-syslog-permission

プラグインのgemインストール

yumインストールした場合はtd-agentが管理するrubyでインストールする必要がある。

sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-zabbix
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-forest

直接配置する場合

/etc/td-agent/plugin/in_xxx.rb or out_xxx.rb

既存ログの取り込み

posファイルを変更してもダメ!tailプラグインしかないのがイタイ。 結局ファイルを上書きすることで解決だが、一気に読み込むため以下のエラーが出てしまう。

2015-09-01 16:28:23 +0900 [warn]: Size of the emitted data exceeds buffer_chunk_limit.
2015-09-01 16:28:23 +0900 [warn]: This may occur problems in the output plugins ``at this server.``
2015-09-01 16:28:23 +0900 [warn]: To avoid problems, set a smaller number to the buffer_chunk_limit
2015-09-01 16:28:23 +0900 [warn]: in the forward output ``at the log forwarding server.``

outputのbuffer_chunk_limitを100Mにしたら、エラーは消えた。

emblukという新しいソリューションが出ているので今後はそちらに期待。

rewrite

いまいち使えないのでFilterを検討する!

インストール

/usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-rewrite

設定

<match test.log>
  type rewrite
  remove_prefix test
  add_prefix reformed
  <rule>
    key message
    pattern hoge
    replace fuga
  </rule>
</match>

Filter

Filter設定例

<source>
  type dummy
  tag raw.dummy
  dummy {"message":"[WARN] warning[tab]message[tab]"}
</source>
<filter raw.**>
  type grep
  regexp1 message WARN
</filter>
<filter raw.**>
  type record_transformer
  enable_ruby true
  <record>
    tag ${tag}
    hostname "#{Socket.gethostname}"
    replaced ${message.gsub(/tab/,'\t')}
  </record>
</filter>
<match raw.**>
  type stdout
</match>

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS