fluentdでRabbitMQにログを送信する

今回は、前回作成したRabbitMQクラスタにfluentdでログを送信する。

1. RabbitMQ側の設定

まず、事前にRabbitMQ側でvHostsなどの作成をしておこう。 ユーザは新規に「logger」ユーザを作成する。

■ vHostsの作成(「logs」)

rabbitmqadmin declare vhost name=/logs
rabbitmqctl set_permissions -p /logs guest ".*" ".*" ".*"
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqadmin declare vhost name=/logs
vhost declared
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqadmin list vhosts
+-------+----------+
| name  | messages |
+-------+----------+
| /     | 0        |
| /logs |          |
+-------+----------+
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl set_permissions -p /logs guest ".*" ".*" ".*"
Setting permissions for user "guest" in vhost "/logs" ...

■ ユーザの作成

rabbitmqctl add_user logger パスワード
rabbitmqctl set_permissions -p /logs logger ".*" ".*" ".*"
rabbitmqctl set_permissions -p / logger ".*" ".*" ".*"
rabbitmqctl set_user_tags logger administrator
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl add_user logger password
Creating user "logger" ...
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl set_permissions -p /logs logger ".*" ".*" ".*"
Setting permissions for user "logger" in vhost "/logs" ...
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl set_permissions -p / logger ".*" ".*" ".*"
Setting permissions for user "logger" in vhost "/" ...
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl set_user_tags logger administrator
Setting tags for user "logger" to [administrator] ...

■ queue/exchangeの作成(ミラーリング設定あり)

rabbitmqadmin declare queue name=syslog.queue --vhost=/logs # queueの作成
rabbitmqadmin declare exchange name=syslog.topic type=topic --vhost=/logs #exchangeの作成
rabbitmqctl list_queues -p /logs
rabbitmqctl set_policy "mirror-test" "syslog.queue" '{"ha-mode":"all"}' -p /logs
rabbitmqadmin list queues name slave_nodes synchronised_slave_nodes
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqadmin declare queue name=syslog.queue --vhost=/logs
queue declared
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqadmin declare exchange name=syslog.topic type=topic --vhost=/logs
exchange declared
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl list_queues -p /logs
Listing queues ...
syslog.queue    0
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl set_policy "mirror-test" "syslog.queue" '{"ha-mode":"all"}' -p /logs
Setting policy "mirror-test" for pattern "syslog.queue" to "{\"ha-mode\":\"all\"}" with priority "0" ...
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqadmin list queues name slave_nodes synchronised_slave_nodes
+--------------+------------------------------+------------------------------+
|     name     |         slave_nodes          |   synchronised_slave_nodes   |
+--------------+------------------------------+------------------------------+
| syslog.queue | ["rabbit@BS-PUB-RABBITMQ02"] | ["rabbit@BS-PUB-RABBITMQ02"] |
| test.queue   | ["rabbit@BS-PUB-RABBITMQ02"] | ["rabbit@BS-PUB-RABBITMQ02"] |
+--------------+------------------------------+------------------------------+

■ Routing Keyの設定

fluentdからRabbitMQにログを転送するにあたり、Routing Keyの設定が必要になる。 今回使用するプラグインではfluentdのタグがRouting Keyとして使用される。 とりあえず「syslog」で送信されるので、それをRabbitMQのWeb管理画面から設定する。 Exchangesタブから、先ほど作成したExchangesを開いて、そこからRouting Keyを設定しておく。

ひとまず、これでRabbitMQ側の設定は完了。

2. fluentd側の設定

fluentdからRabbitMQにログを送信する場合、別途プラグインが必要になるので、以下のコマンドでインストールする。

/opt/td-agent/embedded/bin/gem install fluent-plugin-amqp2

プラグインをインストール後、設定ファイルで以下のように定義してやればよい。

/etc/td-agent/td-agent.conf
<match *.**> type amqp # Set broker host and port host ホスト名(同居させるならlocalhost) port 5672 # Set user and password for authentication user logger(同居させるならguest) password password(同居させるならguest) # Configure amqp entities vhost, exchange id and type vhost /logs exchange Exchange名(今回の場合syslog.topic) exchange_type topic exchange_durable true # optionally set exchange durability - default is true. payload_only false # optional - default is false. if true, only the payload will be sent. if false, data format is { "key" => tag, "timestamp" => time, "payload" => record }. content_type application/octet-stream # optional - default is application/octet-stream. some amqp consumers will expect application/json. </match>

設定ファイルを編集したら、サービスを再起動しよう。

systemctl restart td-agent

サービス再起動後、適当にログを送ってみると、無事syslog.queueにログが転送された。

rabbitmqadmin list queues
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqadmin list queues
+--------------+----------+
|     name     | messages |
+--------------+----------+
| syslog.queue | 557      |
| test.queue   | 0        |
+--------------+----------+

RabbitMQのWeb管理画面からもキューの中身を確認することができる。