2017-09-26 39 views
0

我正在为Go中的一些游戏服务器软件编写一个工具,名为sampctl,主要功能是旋转服务器实例的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)' - 当我创建它时,是否有任何必须放在container.Config中的设置? – Southclaws

+0

注意:如果我在另一个终端中使用'docker attach'和'CTRL + C',它会突然输出所有内容......它似乎在等待输出时锁定,但一旦内部应用程序结束,它就会刷新! – Southclaws

相关问题