2024年1月30日火曜日

docker のログを logspout で集約する

docker のログを logspout で集約する

概要

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 件のコメント:

コメントを投稿