概要
logspout は docker のソケットファイルを使ってログを監視し監視しているログを別のログ集約システムに流すことができるツールです
監視するログはルールによって変更することができるため特定のログだけを特定の場所に飛ばしたりすることができます
今回はとりあえず動かすのが目的なので docker のすべてのログを logstash に流してみます
環境
- macOS 14.2.1
- docker 24.0.7
- docker-compose 2.23.3
- logspout 3.2.14
docker-compose.yml
logger は logstash コンテナで syslog を受取れるようにします
logspout は docker.sock を使い docker ログを監視します
今回の設定はすべてのログ (docker デーモン自体のログ) も監視対象です
web はデバッグ用のアプリになります
version: '3.8'
services:
logger:
image: logstash:8.12.0
volumes:
- ./logstash:/etc/logstash
ports:
- 5000:5000/udp
environment:
- XPACK_MONITORING_ENABLED=false
command: logstash -f /etc/logstash/logstash.conf
logspout:
image: gliderlabs/logspout:v3.2.14
volumes:
- /var/run/docker.sock:/tmp/docker.sock
depends_on:
- logger
command: syslog://192.168.1.23:5000
web:
image: nginx
ports:
- "80:80"
depends_on:
- logspout
logstash.conf
syslog を受取りそれを標準出力します
ポイントは type = docker にする点です
input {
syslog {
port => 5000
type => "docker"
}
}
output {
stdout {}
}
動作確認
- docker-compose up -d
コンテナを起動しアプリにアクセスします
そして logger のログを見るとちゃんとアプリのログが logspout 経由で飛ばされているのが確認できると思います
- docker-compose logs -f
- curl localhost
web-1 | 192.168.65.1 - - [24/Jan/2024:05:53:36 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/8.4.0" "-"
web-1 | 192.168.65.1 - - [24/Jan/2024:05:53:54 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/8.4.0" "-"
logger-1 | "message" => "<14>1 2024-01-24T05:53:36Z f9940f8079d8 docker-web-1 67205 - - 192.168.65.1 - - [24/Jan/2024:05:53:36 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"curl/8.4.0\" \"-\"\n",
logger-1 | "original" => "<14>1 2024-01-24T05:53:36Z f9940f8079d8 docker-web-1 67205 - - 192.168.65.1 - - [24/Jan/2024:05:53:36 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"curl/8.4.0\" \"-\"\n"
特定のログだけフィルタするには
このままだとカーネルログも監視するので logger コンテナのログの量が大変なことになってしまいます
logspout は特定のログだけ監視することができる機能があり例えばコンテナ名で絞り込むには filter.name
という機能を使います
logspout の command で filter.name
を指定します
ワイルドカードで複数のコンテナ名で絞り込むことも可能です
これでカーネルのログは表示されなくなります
version: '3.8'
services:
logger:
image: logstash:8.12.0
volumes:
- ./logstash:/etc/logstash
ports:
- 5000:5000/udp
environment:
- XPACK_MONITORING_ENABLED=false
command: logstash -f /etc/logstash/logstash.conf
logspout:
image: gliderlabs/logspout:v3.2.14
volumes:
- /var/run/docker.sock:/tmp/docker.sock
depends_on:
- logger
command: "syslog://192.168.1.23:5000?filter.name=*web*"
web:
image: nginx
ports:
- "80:80"
depends_on:
- logspout
最後に
logspout を試してみました
現状だと docker のロギングドライバで直接 fluentd や logstash に流すことができるのであまり使用する場面は少ないのかもしれません
またここ最近あまりメンテナンスもされていないため使用は控えたほうがいいのかもしれません
0 件のコメント:
コメントを投稿