31
35

More than 5 years have passed since last update.

fluent-agent-liteとtd-agentで複数サーバーのログを集約 + chefでの設定例

Posted at

AmazonのELB配下とかのインスタンスで、ちぎっては投げちぎっては投げしている環境だとサーバーのログはどこか1つに集めたい。できればリアルタイムに。

parseは必要なかったので

  • [ログ送信側] fluent-agent-lite
  • [ログ集約側] td-agent (とfluent-plugin-file-alternative)

を使ってやりました。

こちら
fluent-agent-lite と td-agent で、小さくはじめる fluentd
を参考にしたらばっちりでした

ログ送信側

fluent-agent-lite インストール

git clone https://github.com/tagomoris/fluent-agent-lite
cd fluent-agent-lite/
bin/install.sh

/usr/local/fluent-agent-liteにいろいろインストールされました。
/etc/fluent-agent-lite.conf が設定ファイルです。

/etc/fluent-agent-lite.conf
TAG_PREFIX="10.10.10.2"
LOGS=$(cat <<"EOF"
messages     /var/log/messages
EOF
)
PRIMARY_SERVER="10.10.10.1:24224"

/var/log/messagesを送信してます。
この設定だと「10.10.10.2.messages」というタグで「10.10.10.1」のサーバーにログを送ります

起動

/etc/init.d/fluent-agent-lite start

デフォルトだと/tmp/fluent-agent.logにログが出るので、うまく立ち上がらないときは確認します。

ログ受信側

td-agentのインストール(CentOS)

curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh

fluent-plugin-file-alternative のインストール

/usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-file-alternative

fluent-gemのパスは環境によって異なるそうです。これはCentOS6.5での例です。

設定はこんな感じにしました

/etc/td-agent/td-agent.conf
<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>

<match **.messages>
  type file_alternative
  path /var/log/servers/messages.*.log
  time_slice_format %Y%m%d
  output_include_time false
  output_include_tag true
  output_data_type attr:message
  add_newline true
</match>

起動

/etc/init.d/td-agent start

うまくいけば/var/log/servers/にファイルができてます

-rw-r--r-- 1 td-agent td-agent   68  7月 15 13:02 2014 messages.20140715.MBeaONz7kAF3ffasa.log

今回は複数サーバーのどのサーバーからのログ排出かをわかるようにする為にoutput_include_tag trueとしました。
こうすると送られてきたログの行頭に送出側で設定したタグが出力されました。
今回の/var/log/messages はログにホスト名が入るので特に不要ですが、サーバーを識別する情報が出力されない場合に便利です。

# tail messages.20140715.MBeaONz7kAF3ffasa.log
10.10.10.2.messages     Jul 15 13:02:39 hogehoge root: hoge

td-agentのログは/var/log/td-agent/td-agent.logに出力されます。
ログファイルを受け取ったのに、どのタグにもマッチしなかった場合は親切に教えてくれるので、うまくいかない場合は参考にします。

[info]: adding source type="forward"
[info]: adding match pattern="**.messages" type="file_alternative"
[info]: listening fluent socket on 0.0.0.0:24224
[warn]: no patterns matched tag="10.10.10.2.messages.typo"
 ↑ログを受け取ったけど、どの設定にもマッチしないタグだった

chefで管理する

ログ送出側はちぎってはなげを頻繁に行うという前提なので、タグの設定をいちいちやるのは面倒です。
chefでprovisionした際にfluent-agent-liteをインストールして、さらに自身のIPをtag prefixに設定するようにします。

fluent-agent-liteはSPEC/fluent-agent-lite.spec が用意されているのでrpmパッケージを作成して、そちらを使ったレシピの例です。

rpmパッケージの作成はREADMEfluent-agent-liteのrpmを作成する - tanihiro.logを参考にしました。

今回、fluent-agent-lite-1.0-original.x86_64.rpmはfilesに置きました
多分こんな感じで動くと思います。

recipes/default.rb
  cookbook_file "/usr/local/src/fluent-agent-lite-1.0-original.x86_64.rpm" do
    source "fluent-agent-lite-1.0-original.x86_64.rpm"
    owner "root"
    group "root"
    mode "0644"
  end

  execute "fluent-agent-lite_install" do
    not_if "rpm -q fluent-agent-lite"
    user "root"
    group "root"
    command <<-EOH
        rpm -ivh /usr/local/src/fluent-agent-lite-1.0-original.x86_64.rpm
    EOH
    action :run
  end

  service "fluent-agent-lite" do
    supports :status => true, :restart => true, :reload => true
    action [ :enable, :start ]
  end

  template "/etc/fluent-agent-lite.conf" do
    source "fluent-agent-lite.conf.erb"
    owner "root"
    group "root"
    mode 0644
    notifies :restart, "service[fluent-agent-lite]", :delayed
  end

fluent-agent-lite.confのテンプレート

templates/default/fluent-agent-lite.conf.erb
TAG_PREFIX="<%= node[:ipaddress] %>"

LOGS=$(cat <<"EOF"
messages     /var/log/messages
EOF
)
PRIMARY_SERVER="10.10.10.1:24224"

<%= node[:ipaddress] %> のように書くとchefのnodeのIPが入ってきます。

31
35
1

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
31
35