Grafana + Loki + Fluentdで実装するSyslogサーバー
はじめに
ログ集約・可視化・検索ツールとしてはELKスタックを利用するケースが多いが、これをLokiに置き換えることでより軽量にログを集約することができるようになる。
Grafana Lab社が開発したLokiは、ログのストリームに対してタグ付けし保存する仕組みを持つ。Prometheusと親和性がたかく、水平展開、高可用性、マルチテナントが可能。
構成
各クライアントからのsyslogは514/udp
ポートで送信される。これをrsyslogデーモンで受け5514/tcp
ポートへ転送する。fluentdは5514/tcp
ポートで受信したsyslogをさらにlokiへ転送する。
+------------------------------------------------+
| |
| +---------+ |
+--------+ 514/udp | | | |
| client +-------------> | |
+--------+ | | | |
| | rsyslog | |
+--------+ 514/udp | | | |
| client +-------------> | |
+--------+ | | | |
| +----+----+ |
| | |
| | 5514/tcp |
| | |
| +----v-----+ +----------+ +------------+ |
| | fluentd +--> loki +--> grafana | |
| +----------+ +----------+ +------------+ |
| |
+------------------------------------------------+
設定
Grafana、Lokiに加え、fluentdの安定配布版であるtd-agentをそれぞれインストールする。
sudo systemctl start grafana
sudo systemctl start loki
sudo systemctl start td-agent
またfluentdからLokiへsyslogを転送するため、fluentdにはfluent-plugin-grafana-loki
プラグインをインストールしておく。
sudo td-agent-gem install fluent-plugin-grafana-loki
各クライアントから514/udp
ポートで受け取ったsyslogを5514/tcp
ポートのfluentdへ転送するため、/etc/rsyslog.d/50-forward.conf
ファイルを作成し、rsyslogを以下の通り設定する。
$ModLoad imudp
$UDPServerRun 514
$ActionQueueType LinkedList
$ActionQueueFileName srvrfwd
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
*.* @@127.0.0.1:5514;RSYSLOG_SyslogProtocol23Format
5514/tcp
ポートで受け取ったsyslogを3100/tcp
ポートのLokiへ転送するため、/etc/td-agent/td-agent.conf
ファイルを編集し、td-agentを以下の通り設定する。
<source>
@type syslog
@id syslog_in
port 5514
bind 0.0.0.0
severity_key level
facility_key facility
tag syslog
<transport tcp>
</transport>
<parse>
message_format rfc5424
</parse>
</source>
<match syslog.**>
@type loki
@id syslog_out
url "http://localhost:3100"
extra_labels {"app":"syslog"}
<label>
pid
host
level
facility
</label>
</match>
rsyslogとfluentdを再起動して設定を反映。
sudo systemctl restart rsyslog
sudo systemctl restart td-agent
以上で設定は終わり。
操作方法
上記の設定により、Lokiにはsyslogが蓄積されてはじめる。
http://<サーバーのIPアドレス>:3000/
へアクセスし、Grafanaを起動してConfiguration > Data Sources
からLokiを選択、URLにhttp://localhost:3100
を記載する。
Explorer
をクリックしてData Source
にLokiを選択。Log labels
に{app="syslog"}
を記載してRun query
をクリックするとsyslogデータが表示される。
何もログが表示されない場合、サーバーにsyslogが到達しているかどうか切り分けるため、クライアントから以下のコマンドでダミーログを飛ばすことができる。
logger -n <サーバーのIPアドレス> -d test
syslogストリームにはSeverityやFacility, Hostnameなどラベル付けされているため、これらを用いたフィルタが可能。
ログメッセージによる検索は{level="info"} |= "session closed"
のように、以下の記法を組み合わせて実現できる。
|= line contains string.
!= line doesn’t contain string.
|~ line matches regular expression.
!~ line does not match regular expression.
メッセージ検索には多少の重さを感じるが、事前に検索対象となる時間範囲を絞り込んでおけば問題ない程度であろう。
以下は公式サイトからの引用。
このような感じにログ絞り込みをしたり、ログ詳細が確認できる。
楽しい!
Discussion