はじめに
前回記事では、LAN内にあるラズパイからのsyslogやHTTP通信をfluentdで捕捉した
ポイントはfluentdをDockerコンテナで作成したことである
Windowsマシン内にあるDockerコンテナにsyslog、http通信が届くようにするためには
WIndowsマシンのポートフォワードを設定する必要があった
本記事は
前回のつづきとして、fluentdで捕捉したデータをElasticsearch, Kibanaへ連携し
LAN内のラズパイから送られてくるsyslogの内容をKibanaで閲覧する
fluentdでは、単にテキストが画面を流れるだけであったが
Kibanaを使うことでグラフィカルに、人が見やすい形でsyslogの内容を把握することができる
ラズパイのsyslog設定
ラズパイのsyslogコンフィグには、TCP通信でWindowsマシンにログを送るように設定している
sudo vim /etc/rsyslog.conf
Dockerのflunetdは5140ポートを公開しているので、5140ポートを指定する
ラズパイ側の設定は以上
Docker Composeファイル
ポイントはタイムゾーンを設定すること
ラズパイの時刻が正確でも、fluentd側が標準時だと
ラズパイのログがfluentdからみて未来の出来事になってしまい
Kibanaでログが表示されない(表示されるのは9時間後?)
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
から始まるインデックス
日付は好みでフォーマットを指定する。下記の通りしていすると日、時間の間にハイフンなど余計な記号が入らず数字が連続して続く表示になる
<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コンテナを立ち上げる
コンテナを立ち上げるとともに、画面にログを表示する
docker compose up -d && docker compose logs -f
Kibanaインデックスをつくる
http://localhost:5601/app/management/kibana/dataViews
にアクセスする
「Create Data View」を押す
fluentdから始まるインデックスが2つ見えているが、mysyslogから始まるインデックスが見当たらない
ラズパイから syslog を送る
fluentd(Elasticsearch?)にインデックスを作成するために
1回ラズパイからsyslogを送る
logger -p local0.info "Message from RaspberryPi"
Kibanaのサイトをリロードすると、mysyslogから始まるインデックスが作成されている
mysyslog-*
を入力して、クリエイト
KibanaのDiscover
LAN内のラズパイから受け取ったメッセージが見える
ラズパイのサービスを再起動したときのログ
ラズパイsyslogサービスを再起動してみる
systemctl restart rsyslog.service
Kibanaをリロードする
ログが記録されている
まとめ
LAN内にあるラズパイのsyslogをKibanaで見える化した
今回は1台のラズパイであったが、もっと複数台あれば楽しそう
惜しむらくは syslog がUDPであり、WSL2はUDPをポートフォワードできないということ・・・
早くここは改善してほしい