Fluentdを使ってApacheのログをRDS(Postgresql)に入れる対応をした時のメモ。
環境
- AWS EC2 on Red Hat Enterprise Linux 6.6 (HVM)
- RDS on PostgreSQL 9.3.5
EC2とRDS作成は省略。EC2とRDSは接続可能なようにネットワークとセキュリティグループの設定をしておくこと
Flunetdインストールの準備
Fluentdインストールの前にを参考に準備を行います。
NTP
こちらを参考に。
CentOSにntpサーバを入れて、日本標準時刻に自動的に合わせるためのメモ
まず、UTCからJST形式に変更します。
$cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
NTP自体はすでにインストールされていたので、設定ファイルを日本の設定に変更します。/etc/ntp.confを開いて
server 0.rhel.pool.ntp.org iburst
server 1.rhel.pool.ntp.org iburst
server 2.rhel.pool.ntp.org iburst
server 3.rhel.pool.ntp.org iburst
となっている部分を
server -4 ntp.nict.jp
server -4 ntp1.jst.mfeed.ad.jp
server -4 ntp2.jst.mfeed.ad.jp
server -4 ntp3.jst.mfeed.ad.jp
と変更。
サービスを起動します。
$sudo service ntpd start
確認。
$ntpq -p
自動起動ON。
$sudo chkconfig ntpd on
ファイルディスクプリンタ
扱えるファイル数を増やすためにファイルディスクプリンタの設定をします。 /etc/security/limits.confを開いて、以下を末尾に追加します。
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
再起動。
$sudo shutdown -r now
確認。
$ulimit -n
ネットワーク関連のパラメータ変更
多分ここあたりの話が関係しているっぽい。
/etc/sysctl.confを開いて追記します。
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10240 65535
反映。
$sudo sysctl -p
確認。
$sudo sysctl -a |grep -e recycle -e reuse -e port_range
Flunetdインストールのインストール
fluentd-インストールのページからインストール対象のディストリビューションを選んでインストール方法を確認します。 Redhatの場合、インストールスクリプトが用意されているのでそれを利用します。
$curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
これでインストールは完了です。
サービスが起動するか確認します。
$sudo /etc/init.d/td-agent start
Starting td-agent: [ OK ]
Fluent-catコマンドを使って挙動を確認する
上記を参考にやってみました。 その他全体の概要についても詳しく書いてあり、参考になりました。
fluentdの設定を変更します。 /etc/td-agent/td-agent.confを以下のようにします。
<source>
type forward
</source>
<match debug.**>
type stdout
</match>
今回はわかりやすいようにtraceモードで起動したいので、一旦デーモンの方は停止させます。
$sudo /etc/init.d/td-agent stop
traceモードをバックグラウンドで起動します。
$td-agent -vv &
fluent-catコマンドを使って確認します。
$ echo '{"json":"message dayo"}' | /usr/lib64/fluent/ruby/bin/fluent-cat debug.test
2015-02-19 22:21:44 +0900 [trace]: plugin/in_forward.rb:189:initialize: accepted fluent socket from '127.0.0.1:23200': object_id=11839160
2015-02-19 22:21:44 +0900 debug.test: {"json":"message dayo"}
2015-02-19 22:21:44 +0900 [trace]: plugin/in_forward.rb:245:on_close: closed fluent socket object_id=11839160
debug.testというファイル名がマッチして表示されている事が確認できます。 試しに他のファイル名でやってみます。
$echo '{"json":"message dayo"}' | /usr/lib64/fluent/ruby/bin/fluent-cat debugaaaa.test
2015-02-19 22:23:56 +0900 [trace]: plugin/in_forward.rb:189:initialize: accepted fluent socket from '127.0.0.1:23201': object_id=70330928356440
2015-02-19 22:23:56 +0900 [warn]: fluent/engine.rb:330:emit: no patterns matched tag="debugaaaa.test"
2015-02-19 22:23:56 +0900 [trace]: plugin/in_forward.rb:245:on_close: closed fluent socket object_id=70330928356440
パターンにマッチしていない事が確認できます。
確認は終わったので、プロセスをkillします。
$ps aux|grep fluentd
$kill KILL hoge
$kill KILL fuga
Apacheのアクセスログをfluentdにかませてファイル出力する
RDSに入れる前にファイル出力が出来るか確認しました。 下記を参考にさせて頂きました。
まず、Apacheをインストールします。
$sudo yum install httpd -y
起動します。
$sudo service httpd start
また、td-agentがアクセスログの読み取りが出来るように権限を変更します。
$sudo chmod a+rx /var/log/httpd
fluentdの設定をApache用に変更します。 /etc/td-agent/td-agent.confを以下のようにします。
<source>
type tail
format apache
path /var/log/httpd/access_log
pos_file /var/log/td-agent/pos/apache.test.log.pos
tag apache.access
</source>
<match apache.access>
type file
path /var/log/td-agent/access_log
</match>
posファイル用のディレクトリを作成します。
$sudo mkdir /var/log/td-agent/pos
$sudo chown -R td-agent:td-agent /var/log/td-agent/pos
デーモンを起動します。
$sudo service td-agent start
アクセスログが追加されるようにWebサーバーにアクセスします。
$wget http://localhost
うまく動作していれば/var/log/td-agent/access_log.20150219.b50f712d6139bb1bcという感じでファイルが出来ているかと思います。
ダメな場合、/var/log/td-agent/td-agent.logを確認するとエラーの原因が書いているかと思います。
RDSにApacheのアクセスログを送る
プラグインを追加して、RDSへ情報を送ります。
まず、プラグインで必要なソフトウェア群をインストールします。
$sudo yum groupinstall "Development Tools" -y
$sudo yum install postgresql postgresql-devel -y
また、psqlコマンドを使ってEC2からアクセスできるか確認します。各パラメーターは自分の環境に変更してください。
$psql -U root -p 5432 -d testdb -h dbinstance.c0cdb3a3yekt.ap-northeast-1.rds.amazonaws.com
アクセス後、fluentd用のテーブルを作成します。
CREATE TABLE fluentd (
tag Text
,time Timestamptz
,record Json
);
fluent-plugin-pgjsonを追加します。
$sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-pgjson
fluentdの設定ファイルを変更します。設定は適宜変更ください。
<source>
type tail
format apache
path /var/log/httpd/access_log
pos_file /var/log/td-agent/pos/apache.test.log.pos
tag apache.access
</source>
<match apache.access>
type pgjson
host dbinstance.c0cdb3a3yekt.ap-northeast-1.rds.amazonaws.com
port 5432
database testdb
table fluentd
user root
password PASSWORD
time_col time
tag_col tag
record_col record
</match>
設定を反映するためにデーモンを再起動します。
$sudo service td-agent restart
テーブルを確認するとログが登録されているのが確認できます。
testdb=> select * from fluentd;
apache.access | 2015-02-19 14:29:39+00 | {"host":"::1","user":"-","method":"GET
","path":"/","code":"403","size":"3985","referer":"-","agent":"Wget/1.12 (linux-
gnu)"}
自分でフォーマットを決める場合
今回、すでに用意されたapacheのフォーマットを利用しましたが、正規表現を用いて自分で定義することもできます。
例えばスペース区切りでcodeとsizeとkeyとする場合、以下のようにします。
<source>
type tail
path /var/log/foo/bar.log
pos_file /var/log/td-agent/foo-bar.log.pos
tag foo.bar
format /^(?<code>[^ ]*) (?<size>[^ ]*)$/
</source>
詳細や例は公式を見ると良いかと思います。
また、以下のサイトで設定した正規表現がどのような挙動となるか確認できます。