[Docker] ラズパイのsyslogをKibanaで閲覧する [EFKスタック]

## はじめに

[前回記事](https://qiita.com/t13801206/items/b25e478e1df3f2685245)では、LAN内にあるラズパイからのsyslogやHTTP通信をfluentdで捕捉した

ポイントはfluentdをDockerコンテナで作成したことである
Windowsマシン内にあるDockerコンテナにsyslog、http通信が届くようにするためには
WIndowsマシンのポートフォワードを設定する必要があった

### 本記事は

前回のつづきとして、fluentdで捕捉したデータをElasticsearch, Kibanaへ連携し
LAN内のラズパイから送られてくるsyslogの内容をKibanaで閲覧する

fluentdでは、単にテキストが画面を流れるだけであったが
Kibanaを使うことでグラフィカルに、人が見やすい形でsyslogの内容を把握することができる

## ラズパイのsyslog設定

ラズパイのsyslogコンフィグには、TCP通信でWindowsマシンにログを送るように設定している

```bash:TeraTermで接続したラズパイで実行
sudo vim /etc/rsyslog.conf
```

Dockerのflunetdは5140ポートを公開しているので、5140ポートを指定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/8d305ba4-c725-c9bf-9bb4-889d43e62147.png)

ラズパイ側の設定は以上

## Docker Composeファイル

ポイントはタイムゾーンを設定すること
ラズパイの時刻が正確でも、fluentd側が標準時だと
ラズパイのログがfluentdからみて未来の出来事になってしまい
Kibanaでログが表示されない（表示されるのは9時間後？）

```yml
version: "3"
services:
  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf:/fluentd/etc
    ports:
      - "24224:24224"
      - "24224:24224/udp"
      - "5140:5140"
    networks:
      efk-net:
        ipv4_address: 172.22.0.10
    environment:
      TZ: Asia/Tokyo
  
  web:
    image: nginx:alpine-slim
    ports:
      - 8000:80
    logging:
      driver: "fluentd"
      options:
        fluentd-address: 172.22.0.10:24224
        fluentd-async-connect: "true"
        fluentd-retry-wait: 2s
        fluentd-max-retries: 30
        tag: httpd.access
    networks:
      efk-net:
        ipv4_address: 172.22.0.20
    depends_on:
      - fluentd
    environment:
      TZ: Asia/Tokyo

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.1.2
    container_name: elasticsearch
    environment:
      - "discovery.type=single-node"
      - xpack.security.enabled=false
      - "TZ=Asia/Tokyo"
    ports:
      - "9200:9200"
    networks:
      - efk-net

  kibana:
    image: docker.elastic.co/kibana/kibana:8.1.2
    ports:
      - "5601:5601"
    networks:
      - efk-net
    environment:
      - "TZ=Asia/Tokyo"
      - i18n.locale=ja-JP

networks:
  efk-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.22.0.0/16
```

なお、`web`コンテナは前回までの名残なので、無くても動作する

## fluent.conf

syslogはデフォルトでUDPなので、プロトコルタイプはTCPを指定する（`protocol_type tcp`）

`logstash_prefix`がKibana側のインデックスになる

- ラズパイからのsyslogは`mysyslog`から始まるインデックス
- Dockerネットワーク内のwebコンテナからのログは`fluentd`から始まるインデックス

日付は好みでフォーマットを指定する。下記の通りしていすると日、時間の間にハイフンなど余計な記号が入らず数字が連続して続く表示になる

```xml
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<source>
  @type syslog
  port 5140
  bind 0.0.0.0
  protocol_type tcp
  tag raspi

  source_hostname_key true  
</source>

<match raspi.*.**>
  @type copy

  <store>
    @type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix mysyslog
    logstash_dateformat %Y%m%d
    flush_interval 1s
  </store>

  <store>
    @type stdout
  </store>
</match>

<match httpd.**>
  @type copy

  <store>
    @type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 1s
  </store>

  <store>
    @type stdout
  </store>
</match>
```

## Dockerコンテナを立ち上げる

コンテナを立ち上げるとともに、画面にログを表示する

```bash
docker compose up -d && docker compose logs -f
```

### Kibanaインデックスをつくる

`http://localhost:5601/app/management/kibana/dataViews`にアクセスする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/0a519138-0a5e-72d9-4072-003e0764eb3b.png)

「Create Data View」を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/a1520f9b-6f00-2dca-8695-9ac93e74f50b.png)

fluentdから始まるインデックスが２つ見えているが、mysyslogから始まるインデックスが見当たらない

#### ラズパイから syslog を送る

fluentd（Elasticsearch？）にインデックスを作成するために
１回ラズパイからsyslogを送る

```bash:ラズパイで実行
logger -p local0.info "Message from RaspberryPi"
```

Kibanaのサイトをリロードすると、mysyslogから始まるインデックスが作成されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/59369086-e871-7e02-1a84-891eb8aabeb0.png)

`mysyslog-*`を入力して、クリエイト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/842177b5-9194-d328-387b-8a5bf0965512.png)


## KibanaのDiscover

LAN内のラズパイから受け取ったメッセージが見える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/2c2ef64b-8660-5f13-8118-dc49bae046e5.png)

### ラズパイのサービスを再起動したときのログ

ラズパイsyslogサービスを再起動してみる

```bash:ラズパイのsyslogを再起動する
systemctl restart rsyslog.service
```

Kibanaをリロードする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/0a9a0cbb-c17f-5420-6f90-2ccf58348527.png)

ログが記録されている

## まとめ

LAN内にあるラズパイのsyslogをKibanaで見える化した

今回は１台のラズパイであったが、もっと複数台あれば楽しそう

惜しむらくは syslog がUDPであり、WSL2はUDPをポートフォワードできないということ・・・
早くここは改善してほしい

https://learn.microsoft.com/ja-jp/windows/wsl/networking#accessing-a-wsl-2-distribution-from-your-local-area-network-lan

## 糸冬了！！