Armoris日記 syslogサーバー構築編

このブログは、PlanetSide2から来てN高等学校に紛れ込んでいる株式会社Armorisのアルバイトseigo2016が書いています。
あるもりすぶろぐの内容は個人の意見です。

MattermostのログをKibanaで可視化する

今回のArmorisブログではMattermostと言われるSlackライクなチャットツールのログを収集し、Kibanaというツールを用いてIndex Patternを作成しログを可視化する方法を紹介します。

環境

syslogサーバー (ローカルIP: 172.20.100.37)

syslogサーバーとして以下の環境を使用しています。

name version
Ubuntu 20.04.2 LTS
td-agent 4.1.0
Elasticsearch 7.11.1
Kibana 7.11.2
Mattermostサーバー

今回収集するMattermostのログは以下のパスに保存されているものを使用します。

  • Mattermost ログ /opt/mattermost/logs/mattermost.log
name version
Vagrant (bento/ubuntu-20.04)
td-agent 4.1.0
mattermost 5.32.1

1. syslogサーバーの環境構築

まずは今回のメインであるログを収集するためのソフトウェアであるtd-agent(fluentd)を公式のリファレンスに従ってインストールします。

公式ページによると、td-agentはfluentdの安定版とのことです。
以下公式ページより

td-agent is a stable distribution package of Fluentd. 

以下のコマンドを使用してインストールスクリプトをダウンロードし実行します。

curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-focal-td-agent4.sh | sh

fluentdからElasticsearchに流すためのプラグインをインストールします。

sudo /usr/sbin/td-agent-gem install fluent-plugin-elasticsearch

次に公式のリファレンスに従ってElasticserachをインストールします。

設定は/etc/elasticsearch/elasticsearch.ymlファイルを編集します。
今回は同じサーバー上で動いているfluentdからしかログを受け取らないため、network.hostはデフォルトのlocalhostからリクエストを受け取る設定にします。
また、待ち受けるポートは9200になります。

network.host: _local_
http.port: 9200

Elasticserachの設定が完了したら公式のリファレンスに従ってKibanaをインストールします。

Kibanaの設定は/etc/kibana/kibana.ymlファイルを編集します。

server.port: 5601
server.host: "172.20.100.37"
elasticsearch.hosts: ["http://localhost:9200"]

2. Mattermostのログの収集

syslogサーバーの設定が完了したらMattermostのログ(今回の環境では/opt/mattermost/logs/mattermost.log)をfluentdで読み込み後、syslogサーバーに転送するための設定を行います。

Mattermostのサーバーにもsyslogサーバーと同じ手順でtd-agentをインストールします。

td-agentがインストールできたらMattermostのログをsyslogサーバーに転送する設定をします。
読み込むログファイルのパスとして、/opt/mattermost/logs/mattermost.logを指定し、管理しやすいようにタグをmattermostに設定します。
最後に読み込んだログの位置を記録するファイル(pos_file)も指定します。


  @type tail
  
    @type none
  
  path /opt/mattermost/logs/mattermost.log
  pos_file /var/log/td-agent/tmp/mattermost.pos
  tag mattermost

次にmattermostタグのついたイベントを、syslogサーバーで待ち構えているfluentdにforwardプラグインを使用して転送します。
<server>ディレクトリ内に送信先のサーバーのipアドレスとポートを指定します。


  @type forward
  send_timeout 60s
  
    host 172.20.100.37
    port 24424
  

Mattermostサーバーからsyslogサーバーに転送したmattermostタグが付いたイベントに対して処理を行います。
mattermostタグのついているログに対して、filterプラグインを使用してjsonフォーマットとしてパースし、ElasticsearchプラグインでElasticsearchに転送します。

syslogサーバーは24424ポートで待ち受けます。


  @type forward
  port 24424
  bind 0.0.0.0

mattermostタグのついたイベントのmessageキーをjsonログとしてパースします。


  @type parser
  key_name message
  
    @type json
  

mattermostタグのついたイベントをポート9200で待ち受けているElasticsearchに送信します。
logstash_formatとはログをlogstashのログ形式(logstash-%Y.%m.%d)にフォーマットするかどうかを指定します。
logstash_prefixlogstash_formatのログ名部分を指定した名称にします。この場合はmattermost-%Y.%m.%dのようになります。


  @type elasticsearch
  host 127.0.0.1
  port 9200
  type_name mattermost
  logstash_format true
  logstash_prefix mattermost

3. Kibanaの設定

最後にKibanaでの設定を行います。
まずは下の画像のように左のメニュータブを開き、Stack Managementを選択してインデックスメニューを作成します。

f:id:Armoris:20210326151001p:plain

次に、下の画像のように左のメニューからIndex Patterns(画像の①)を選択し、Create index patternをクリック(画像の②)して作成画面に遷移します。

f:id:Armoris:20210326151030p:plain

Index Pattern Nameには、収集したいログのtd-agent.conflogstash_prefixに設定した名前を指定します。

今回はIndex Nameがmattermost-%Y.%m.%dという形式になるため、これにマッチさせる為に下の画像のようにmattermost-*と指定しNext Stepをクリックします。

f:id:Armoris:20210326150657p:plain

Time fieldは@timestampを指定して作成します。

f:id:Armoris:20210326150700p:plain

以上の設定を行うと以下の画像のようなフィールド構造になります。

f:id:Armoris:20210326150829p:plain

最後に正常に設定できているか確認します。
以下の画像のように左のメニューのAnalytics欄のDiscoverをクリックすることで、収集されたログが表示されます。

f:id:Armoris:20210326150849p:plain

最後に

今回はFluentdとElasticsearch、Kibanaを利用してログを収集する方法をご紹介しました。
複数のサーバーで運用しているサービスのログを一箇所で管理することでそれぞれのサーバーにログを見に行く手間が省け、調査が容易になる為とても便利だと思います。
管理対象のログが複数サービスでは無い場合でも、生のログファイルを見るよりもグラフ表示などにより格段に見やすく為是非試してみてください。