Logstashでsyslogとシステム稼働情報をElasticsearchにアップロードする

## はじめに
ログ管理のために、ELK Stackを使うことは良くあると思いますが、システム稼働情報をLogStashで管理してみようと思い、久々に設定をしてみようと思ったら、思いの他手間取ったのでまとめました。
通常、システム稼働情報はZabbixを使うことが多いのですが、管理するOSSを増やしたくないのでMetricbeatを採用しました。

対象のELK Stackのバージョンは8.15.0を使用しました。
ElasticsearchとKibanaはDocker composeを使って立ち上げました。

```docker-compose.yaml
version: "3"

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.15.1
    ports:
      - 9200:9200
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1

  kibana:
    image: docker.elastic.co/kibana/kibana:8.15.1
    environment:
      ELASTICSEARCH_HOSTS: http://elasticsearch:9200
    ports:
       - 5601:5601
```

なお、本来はSSL証明書を準備する必要があるのですが、今回は作成するのが面倒なので全て平分で通信します。
本来は、準備すべきなのでEnterprise環境では必ず用意しましょう。

## syslogの設定
syslogと呼んでいますが、実際はrsyslogを使用します。
rsyslogの設定は`/etc/rsyslog.conf`と`/etc/rsyslog.d`の中に配置されています。
今回は`90-logstash.conf`としました。

以下の設定では、1ブロック目で`*.*`とすることで全てのログを、2ブロック目でホスト名、ポートを指定します。

```90-logstash.conf
*.*    @@localhost:31514
```

今回はLogstashの31514番ポートにsyslogの設定を送ります。

## Logstashの導入
ドキュメントを参考に導入を行います。
ついでに、metricbeatの導入も済ませてしまいます。

https://www.elastic.co/guide/en/logstash/current/installing-logstash.html

```bash
curl -O /etc/apt/keyrings/elastic-keyring.asc -XGET https://artifacts.elastic.co/GPG-KEY-elasticsearch
echo deb [signed-by=/etc/apt/keyrings/elastic-keyring.asc] https://artifacts.elastic.co/packages/8.x/apt stable main | sudo tee  /etc/apt/sources.list.d/elastic-8.x.list > /dev/null
sudo apt update && sudo apt install -y metricbeat logstash
```

## Metricbeatの設定
`/etc/metricbeat/metricbeat.yml`を編集します。
今回はLogstash経由でMetricbeatにログを上げます。
`output.logstash`を追記します
基本的にデフォルト設定を使いますが、sslを無効にする設定だけは忘れずに実施します。

```/etc/metricbeat/metricbeat.yml

output.logstash:
  enabled: true
  # Logstashでリッスンするポート
  hosts: ["localhost:5044"]

  # Worker数
  worker: 1

  compression_level: 3
  escape_html: false
  ttl: 30s
  loadbalance: false
  pipelining: 2

  slow_start: false

  backoff.init: 1s
  backoff.max: 60s
  index: 'metricbeat'
  # SSLを無効化
  ssl.enabled: false
  ssl.verification_mode: "none"
```

## Logstashの設定
Logstashの設定は`/etc/logstash`に配置されています。
まず`pipelines.yml`を設定します。
ここには、パイプライン処理の一覧を記述します。
今回はsyslogとmetricbeatの2つのパイプラインを記述します。

``` /etc/logstash/pipelines.yml
- pipeline.id: metircbeat
  pipeline.batch.size: 125
  path.config: "/etc/logstash/conf.d/metricbeat.conf"
  pipeline.workers: 1
- pipeline.id: syslog
  pipeline.batch.size: 125
  path.config: "/etc/logstash/conf.d/syslog.conf"
  pipeline.workers: 1
```

### metricbeatの設定
MetricbeatをLogstashで受けるための設定を行います。
Logstashのパイプライン設定は癖がありますが、簡単に説明します。
inputにmetricbeatが使用しているポート番号、outputにElasticsearchのホスト名をそれぞれ指定します。
また、複数台のサーバからログを上げる場合は、indexを分けるかfilterにadd_fieldで追加すると良いでしょう。
今回は仮想のホスト名として`example01`を指定します。

``` /etc/logstash/conf.d/metricbeat.conf

input {
  beats {
    port => 5044
  }
}

filter {
  add_field => { "Hostname" => "example01" }
}

output {
  elasticsearch {
    hosts => ["http://127.0.0.1:9200"]
    index => "log-syslog-%{+YYYY.MM.dd}"
    ssl => false
    ssl_certificate_verification => false
  }
}

```

### syslogの設定
syslogをLogstashで受けるための設定を行います。
基本的には、Metricbeatの時と同じですが、ポート設定だけrsyslogの設定時と同じポートを使用する点に注意しましょう。

``` /etc/logstash/conf.d/syslog.conf
input {
  tcp {
    host => "127.0.0.1"
    port => 31514
    type => rsyslog
  }
}

filter {
  add_field => { "Hostname" => "example01" }
}

output {
  elasticsearch {
    hosts => ["http://127.0.0.1:9200"]
    index => "log-syslog-%{+YYYY.MM.dd}"
    ssl => false
    ssl_certificate_verification => false
}
```

以上の設定を終えたらKibanaからindexが増えていることを確認しましょう。

## まとめ
今回はLogstashでsyslogとシステム稼働情報をアップしました。
grokを使えばログをより管理しやすい形態に整理することもできます。