🌲

Grafana + Loki + Fluentdで実装するSyslogサーバー

2020/11/25に公開

はじめに

ログ集約・可視化・検索ツールとしては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   |   |
                   |   +----------+  +----------+  +------------+   |
                   |                                                |
                   +------------------------------------------------+

設定

GrafanaLokiに加え、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