2017-09-26 2 views
0

私はsampctlと呼ばれるGOのゲームサーバーソフトウェア用のツールを作成しています。主な機能は、サーバーインスタンスのDockerコンテナをスピンアップしてからログを取得することです後で分析するために、Elasticsearchや管理パネルなどのユーザーの選択した場所にそれらを送信してください。Go SDKを使用したDockerコンテナログのストリーム方法

私は他のすべての仕事をしている、私は働くことができない唯一のことはストリーミングログです。私はログを取得することができます。コンテナ内のアプリケーションがクラッシュしたときにリアルタイムでログをストリーミングする必要がある場合。

ContainerLogsが返されたReadCloserのスキャナを使用しようとしましたが、端末にちょうどぶら下がっていました。

https://github.com/Southclaws/sampctl/blob/9c76b4dd1b3dbb9e18927da10028d5beeb94f728/run_container.go#L64-L67

ContainerLogsも、ストリーミングをサポートしていますか?それとも私は、これはドッカーの質問よりも囲碁の質問の多い場合、私は...

ここに投稿したり、GoLangBridgeにするかどうか、あまりにも確認されませんでした

謝罪...別のソリューションを把握する必要があります

答えて

2

あなたはお読みになりましたthe docs?ストリームにはメタデータが埋め込まれているため、そのストリームをコンソールにパイプすることはできません。

私は監視アプリケーションに次のコードを持っている:

i, err := cli.ContainerLogs(context.Background(), cid, types.ContainerLogsOptions{ 
     ShowStderr: true, 
     ShowStdout: true, 
     Timestamps: false, 
     Follow:  true, 
     Tail:  "40", 
    }) 
    if err != nil { 
     log.Fatal(err) 
    } 
    hdr := make([]byte, 8) 
    for { 
     _, err := i.Read(hdr) 
     if err != nil { 
      log.Fatal(err) 
     } 
     var w io.Writer 
     switch hdr[0] { 
     case 1: 
      w = os.Stdout 
     default: 
      w = os.Stderr 
     } 
     count := binary.BigEndian.Uint32(hdr[4:]) 
     dat := make([]byte, count) 
     _, err = i.Read(dat) 
     fmt.Fprint(w, string(dat)) 
    } 

それは限り、私はそれを実行し続けるとストリーム。あなたのためにそのほとんどを行うためにthis helper packageもありますが、私の場合、他の理由でこのようなメッセージを個別に処理する必要があります。私はいくつかの他のオプションを設定する必要がありました

+0

おお、私はあてもなく、メタデータを剥がしたと感謝、私はちょうど\まで読むことができるのn ...私はそれを試してみるよと思った:ここ

が更新されたコードです! – Southclaws

+0

残念ながら 'i.Read(hdr)'にぶら下がっています - コンテナに入れなければならない設定はありますか? – Southclaws

+0

サイドノート:別の端末で 'docker attach'と' CTRL + C'を押すと、突然すべてが出力されます...出力を待っている間にロックされたようですが、内部アプリケーションが終了するとすぐにフラッシュされます。 – Southclaws

0

さて、私はこの問題を解決するために管理し、captncraigの答えは、私はまだ好奇心だよこれは動作しませんでしたが、ちょっと、ここに私の解決策は、理由は私はわかりません私ContainerCreateコール:

 Tty:   true, 
     AttachStdout: true, 
     AttachStderr: true, 

その後scanner.Scan()方法は完全に働きました! https://github.com/Southclaws/sampctl/blob/1ad7971d817031bd5a5b3acfad3bf2ea69232c98/run_container.go#L56-L70

関連する問題