Stackdriver 日志未显示在 GKE 中

Stackdriver logs not showing up in GKE

我无法看到使用 Golang 从我的 GKE 集群发送的日志消息。它们在本地 运行 但在 GKE 中的容器 运行 时工作正常。显然 GKE 中配置错误,但我没有看到任何错误,但不确定去哪里查看。任何见解或要检查的地方都会非常有用。

下面是我的代码和集群作用域(如果有帮助的话)。

谢谢。

范围:

oauthScopes:
- https://www.googleapis.com/auth/cloud-platform
- https://www.googleapis.com/auth/compute
- https://www.googleapis.com/auth/datastore
- https://www.googleapis.com/auth/devstorage.full_control
- https://www.googleapis.com/auth/devstorage.read_only
- https://www.googleapis.com/auth/logging.write
- https://www.googleapis.com/auth/monitoring
- https://www.googleapis.com/auth/monitoring.write
- https://www.googleapis.com/auth/pubsub
- https://www.googleapis.com/auth/service.management.readonly
- https://www.googleapis.com/auth/servicecontrol
- https://www.googleapis.com/auth/source.full_control
- https://www.googleapis.com/auth/sqlservice.admin
- https://www.googleapis.com/auth/trace.append

代码:

func LogMessage(logLevel ReddiyoLoggingSeverity, message, domain, transactionID string) {

    ctx := context.Background()
    // Creates a client.
    client, err := logging.NewClient(ctx, loggingData.ProjectID)
    if err != nil {
        log.Fatalf("Failed to create client: %v", err)
    }

    // Selects the log to write to.
    logger := client.Logger(loggingData.LogName)

    labels := make(map[string]string)
    labels["transactionID"] = transactionID
    labels["domain"] = domain

    var logSeverity logging.Severity
    switch logLevel {
    case debug:
        logSeverity = logging.Debug
    case info:
        logSeverity = logging.Info
    case warning:
        logSeverity = logging.Warning
    case reddiyoError:
        logSeverity = logging.Error
    case critical:
        logSeverity = logging.Critical
    case emergency:
        logSeverity = logging.Emergency
    default:
        logSeverity = logging.Warning
    }
    logger.Log(logging.Entry{
        Payload:  message,
        Severity: logSeverity,
        Labels:   labels})
    // Closes the client and flushes the buffer to the Stackdriver Logging
    // service.
    if err := client.Close(); err != nil {
        log.Fatalf("Failed to close client: %v", err)
    }
}

看这里:

https://cloud.google.com/kubernetes-engine/docs/tutorials/authenticating-to-cloud-platform

您的容器化客户端无法针对云平台日志记录服务进行身份验证。

当 运行 客户端在本地时,您没有解释如何进行身份验证,但需要在 Kubernetes 上重现此机制。

如果您检查容器的日志,这些应该可以确认未能针对日志记录服务进行身份验证。

HTH!

所以解决方案比我预期的要简单。我还没有完全理解它,但似乎是 stackdriver 的工作原理。

当我在本地 运行 时,我的日志显示在 Google 项目下 --> 项目 ID --> 日志名称

当我在 GKE 中 运行 时,它会显示在 VM 实例中 --> 实例 ID(或所有实例)--> 日志名称

我实际上希望它一直出现在 google 项目下。要么没有,要么我错误配置了 Stackdriver。