fluentを使ったログ集約
アプリケーションサーバのログを集約するのにfluentを利用してみたのでその備忘録。
構築手順を以下にまとめてみます。
構成
アプリケーションサーバから、各種のログをログ集約サーバへ送信する。
対象となるOSは、AmazonLinux
リポジトリの追加
[treasuredata] name=TreasureData baseurl=http://packages.treasure-data.com/redhat/$basearch gpgcheck=0
ユーザの作成
fludentのユーザを作成します。ユーザ名は、td-agent
# groupadd -g xxx td-agent # useradd -u xxx -g td-agent -s /sbin/nologin td-agent
udi,gidは各サーバで同一のものを設定する
fluentのインストール
yum .confにプロキシの設定があることを確認
※普通に外へ出れるのなら必要なし。
インストールバージョンは、1.1.13でした。
ltsvを使用したいので、対応したバージョンを導入しました。
# yum install td-agent プラグインをコンパイルするためのgcc,makeをインストール # yum install make gcc fluentdプラグインのインストール # /usr/lib64/fluent/ruby/bin/fluent-gem update -p http://xxxx.xxx.xxx.xx:yyyy # /usr/lib64/fluent/ruby/bin/fluent-gem install -p http://xxx.xxx.xxx.xxx:yyyy fluent-plugin-forest # /usr/lib64/fluent/ruby/bin/fluent-gem install -p http://xxx.xxx.xxx.xxx:yyyy fluent-plugin-config-expander # /usr/lib64/fluent/ruby/bin/fluent-gem install -p http://xxx.xxx.xxx.xxx:yyyy fluent-plugin-file-alternative
POSファイル用のディレクトリ作成
# mkdir /var/log/td-agent/pos # chown td-agent:td-agent /varlog/td-agent/pos
ログを読めるように権限設定を変更
# chgrp td-agent /var/log/messages # chgrp td-agent /var/log/secure # chgrp td-agent /var/log/cron # chgrp td-agent /var/log/tomcat/ # chgrp td-agent /var/log/nginx/ # chmod g+rx /var/log/messages # chmod g+rx /var/log/secure # chmod g+rx /var/log/cron # chmod g+rx /var/log/tomcat/ # chmod g+rx /var/log/nginx/
nginxの設定追加
nginxのログをltsv形式で出力するためにログフォーマットに以下を追加
log_format ltsv 'hostname:$hostname' '\ttime:"$time_local"' '\thost:$remote_addr' '\tforwardedfor:"$http_x_forwarded_for"' '\treq:$request' '\tstatus:$status' '\tsize:$body_bytes_sent' '\treferer:$http_referer' '\tua:"$http_user_agent"' '\treqtime:$request_time' '\tcache:$upstream_http_x_cache' '\truntime:$upstream_http_x_runtime' '\tvhost:$host' '\tcookie:"$http_cookie"' '\tut:$upstream_response_time' '\tcs:$upstream_cache_status';
アプリケーションのログを出力する設定
アプリケーション側には、fluent-logger-0.2.6を使用してfluentへ出力する。
ただし、これだけだと使いずらいのでfluent-appenderを使用してlog4jの設定で出力をできるようにしました。
fluent-appenderも以下のように多少手を加えた。
- stackTraceを出力できるようにした。
- ホスト名をログに含めるようにした。
- ミリ秒単位の日時をログへ追加した。
fluentdの設定
送信側の設定の設定は、大体こんな感じ。
サーバ設定
<source> type forward port 24224 # default </source> <match *.**> type forward retry_limit 5 flush_interval 5s <server> host 111.111.111.111 port 123123 </server> </match>
個別の設定
syslogの送信設定
<source> type config_expander <config> type tail format syslog path /var/log/messages pos_file /var/log/pos/messages.pos tag ${hostname}/syslog.messages </config> </source>
nginxのアクセスログの設定
<source> type config_expander <config> type tail format ltsv time_format "%Y/%m/%d:%H:%M:%S %z" path /var/log/nginx/vhost.access.ltsv.log pos_file /var/log/nginx/vhost.access.ltsv.log.pos tag nginx.access.vhost.${hostname} </config> </source>
catalina.outのログ設定
<source> type config_expander <config> type tail path /var/log/tomcat/logs/catalina.out pos_file /var/log/tomcat/logs/catalina.out.pos tag ${hostname}/catalina.out format /^(?<message>.*$)/ time_format "%Y-%m-%d %H:%M:%S %z" </config> </source>
受信側の設定は、こんな感じでやって見ました。まだ工夫の余地があるかも。
syslogの受信設定
<match */syslog.messages> type forest subtype file_alternative <template> path /var/log/syslog/messages.%Y%m%d.log output_include_time true output_include_tag true output_data_type attr:host,ident,pid,message add_newline true field_separator SPACE localtime flush_interval 1s </template> </source>
nginxのアクセスログの設定
<match nginx.access.vhost.*> type copy <store> type stdout </store> <store> type forest subtype file_alternative <template> path /var/log/nginx/nginx-vhost-access.%Y%m%d%H.log flush_interval 1s field_separator SPACE localtime </template> </store> </match>
tomcatのログの設定
# 追加のアペンダーを出力 <match log4j-appender.*> type copy <store> type stdout </store> <store> type forest subtype file_alternative <template> path /var/log/tomcat/logs/app-common.%Y%m%d%H.log output_data_type attr:time,hostname,thread,level,loggerName,message add_newline true field_separator SPACE flush_interval 1s time_format "%Y-%m-%d %H:%M:%S.%3N" localtime </template> </store> </match> #catalina.out <match */catalina.out> type copy <store> type stdout </store> <store> type forest subtype file_alternative <template> path /var/log/tomcat/logs/catalina.%Y%m%d.out output_include_time true output_include_tag true output_data_type attr:message add_newline true field_separator SPACE flush_interval 1s localtime </template> </store> </match>
ひとまず、こんな設定で運用をしてみて様子見です。