使用 Go 在 Google Container/Compute Engine 中登录到 Google Cloud

Posted

技术标签:

【中文标题】使用 Go 在 Google Container/Compute Engine 中登录到 Google Cloud【英文标题】:Logging to the Google Cloud in Google Container/Compute Engine with Go 【发布时间】:2016-06-05 13:29:48 【问题描述】:

我有一个 GKE 应用程序,它有 20 个运行 Go 的节点。我想合并所有日志以在 Google Developers Console 日志查看器中查看,但我遇到了 2 个问题。我无法获得严重性过滤,并且我的日志消息中的每个换行符都会在查看器中启动一个新的日志条目(日志中的换行符有问题)。

我有 google-fluent-d 设置,所以所有标准输出都记录在云中,我利用 log.Lshortfile、调用深度和 log.Logger.Output 从“日志”中获取文件名和行号图书馆。

我查看了这个库:“google.golang.org/cloud/logging”,但我无法让它工作。

是否有某个库或在 GKE 和 GCE 中编写日志的最佳方式的示例?

【问题讨论】:

【参考方案1】:

根据你的雄心壮志,你可以做几件事。

最简单的选择可能是将您的日志记录格式切换为 JSON。 google-fluentd 代理会自动为您解析 JSON,将每条消息的结构化数据导出到云日志 API。如果 severity 字段在 JSON 中,它将自动获取严重性信息,并且使用 JSON 可以防止它在消息中中断(转义)换行符。

更严格(但更灵活)的选择是让您发现工作的客户端库。我不确定它是否与您链接的相同,但我相信this is the most recent one。如果您可以提供有关您遇到的问题的更多背景信息,我可以帮助或与云日志记录团队中的某个人争吵以提供帮助。

【讨论】:

谢谢!是否有任何文档说明可以添加到 JSON 日志中的内容?例如,实际消息或标志的键是什么。 它似乎根本没有很好的记录,抱歉。特殊字段只是日志严重性的真正“严重性”和实际日志消息的“消息”。代码本身就是我从这里得到的:github.com/GoogleCloudPlatform/fluent-plugin-google-cloud/blob/… 自从将节点升级到 >= 1.6 后,这似乎已停止工作。整个 JSON 对象现在在 textPayload 下显示为未解析:-( 我之前的评论中提到的问题是这个,看起来很快就会修复:) github.com/kubernetes/kubernetes/issues/48108【参考方案2】:

我使用自定义日志记录类,而不是记录每条消息,而是将它们保存在一个变量中,并在服务器响应后发送 - 所以我最终在谷歌云中只有一个日志记录,每个请求都有一个很长的 textPayload。

自定义日志类如下所示:

class CustomLogging 
   
    messages = "";

    log(message) 
        this.messages += '\n' + message;
    

    sendLogs(message) 
        console.log(this.messages);
    


每个请求日志如下所示:

【讨论】:

以上是关于使用 Go 在 Google Container/Compute Engine 中登录到 Google Cloud的主要内容,如果未能解决你的问题,请参考以下文章

Go语言容器(container)

使用 Container OS (COS) 在 Google Container Engine 中挂载 NFS 卷

redhat7.4 docker run启动容器报错container_linux.go:449

go语言中container容器数据结构heaplistring

清晰架构(Clean Architecture)的Go微服务: 程序容器(Application Container)

Docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:296: