web-dev-qa-db-ja.com

GELFログドライバーでdocker-composeを使用する

公式のDockerドキュメントによる によると、コンテナのstdoutおよびstderr出力を GELFメッセージ として取得できます。例えばによって理解されるフォーマット Graylog/Graylog2 および logstash

これは、コマンドラインから手動でコンテナーを実行するときにうまく機能します。例えば、

docker run --log-driver=gelf --log-opt gelf-address=udp://localhost:12201 busybox echo This is my  message.

uDP入力リスナーがポート12201で構成されているlocalhostで実行されている私のGraylog2サーバーにログメッセージを送信します。

ここで、同じログオプションを docker-compose で使用したいと思います。これは、ドキュメントによると、 原則として可能であるべきです です。ただし、ドキュメントではjson-filesyslognone以外のログ形式については言及されていません。

my-container:
  container_name: ...
  build: ...
  ports: ...
  log_driver: "gelf"
  log_opt:
    gelf-address: "udp://localhost:12201"

私のdocker-compose.ymlファイルでは、docker-compose upは次のエラーで失敗します:

Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.main", line 39, in main
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.docopt_command", line 21, in sys_dispatch
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.command", line 27, in dispatch
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.docopt_command", line 24, in dispatch
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.command", line 59, in perform_command
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.main", line 495, in up
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.project", line 265, in up
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 369, in execute_convergence_plan
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 270, in create_container
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 643, in _get_container_create_options
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 656, in _get_container_Host_config
  File "/code/build/docker-compose/out00-PYZ.pyz/docker.utils.types", line 27, in __init__
ValueError: LogConfig.type must be one of (json-file, syslog, none)

参考までに、これはdocker-compose 1.4.0とdocker 1.8.1にあり、d12ea79をビルドしました。

どうやら、Dockerとdocker-composeは、ここでは同じレベルの実装ではありません。これはすでに解決され、GithubのMaster branchに含まれていることがわかりました。 https://github.com/docker/compose/issues/1869 および httpsを参照してください。 ://github.com/docker/docker-py/pull/724

現在のマスターブランチからdocker-composeを再インストールする方法、または既存のインストールに手動で追加する方法はありますか?コミットが私のホストのどこかに行くファイルを見つけることができませんでした...

17
Dirk

この問題は修正されました。

Docker-compose 1.5.0rc2 を使用してgraylog2へのロギングをテストしました

この実用的なサンプルyamlで試すことができます:

example:
 container_name: example
 image: debian:wheezy
   command: /bin/sh -c "while true; do date && echo "hello"; sleep 1; done"
 ports:
  - "1234:1234"
 log_driver: "gelf"
 log_opt:
   gelf-address: "udp://graylog.example.com:12201"
   gelf-tag: "first-logs"

コンテナが起動すると警告が表示されます

example | WARNING: no logs are available with the 'gelf' log driver

ただし、メッセージがgraylogに送信されることには影響がないようです。

13

Docker-Compose v2サービスの場合、構文がわずかに変更され、すべてが新しい「logging」セクションの下にあります。

version: "2"

services:
  example:
    container_name: example
    image: debian:wheezy
    command: /bin/sh -c "while true; do date && echo "hello"; sleep 1; done"
    ports:
      - "1234:1234"
    logging:
      driver: "gelf"
      options:
        gelf-address: "udp://graylog.example.com:12201"
        tag: "first-logs"

重要な注意点:Dockerはホストのネットワークを通じてこのアドレスを解決するため、gelf-addressのアドレスはサーバーの外部アドレスである必要があります。

10
nwinkler