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 が設定ファイルです。
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での例です。
設定はこんな感じにしました
<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パッケージの作成はREADMEやfluent-agent-liteのrpmを作成する - tanihiro.logを参考にしました。
今回、fluent-agent-lite-1.0-original.x86_64.rpmはfilesに置きました
多分こんな感じで動くと思います。
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のテンプレート
TAG_PREFIX="<%= node[:ipaddress] %>"
LOGS=$(cat <<"EOF"
messages /var/log/messages
EOF
)
PRIMARY_SERVER="10.10.10.1:24224"
<%= node[:ipaddress] %> のように書くとchefのnodeのIPが入ってきます。