【问题标题】:JSON format for Stackdriver logging in Google Kubernetes EngineGoogle Kubernetes Engine 中 Stackdriver 日志记录的 JSON 格式
【发布时间】:2018-08-23 07:21:36
【问题描述】:

我目前正在寻找最简单的 JSON 日志消息,这些消息将简单地将严重性和消息从在 ​​Kubernetes Engine 中运行并使用托管 Fluentd 守护程序的容器写入 Stackdriver 日志记录。

基本上我正在编写如下单行 JSON 条目。

{"severity": "DEBUG", "message": "I'm a debug entry"}
{"severity": "ERROR", "message": "I'm an error entry"}

这些最终会在 Stackdriver 日志记录中显示以下结果。

  • 严重性始终为 INFO
  • 日志条目中有 JSON 有效负载,唯一的内容是消息,即严重性不在那里。

我的结论是 Fluentd 将日志行识别为 JSON,但我不明白的是,严重性如何没有正确设置到日志条目中。我是不是例如缺少一些需要填写的必填字段?

【问题讨论】:

  • 您是否有任何理由不使用会自动进行正确格式化的客户端库?
  • 正在尝试将数十个现有服务迁移到 Kubernetes。
  • @JordiMiralles 说客户端库可能非常大,而你想要的只是一个结构定义。

标签: kubernetes google-cloud-platform google-kubernetes-engine


【解决方案1】:

根据您提供的信息,我猜 fluentd 将您的整个 JSON 作为 jsonpayload 作为 logEntry 传递,并从环境变量中提供日志名称、资源类型和其他所需信息。

最终 Stackdriver 收到的内容必须如下所示:

{
 "logName": "projects/[YOUR PROJECT ID]/logs/[KUBERNETES LOG]",
 "entries": [
  {
   "jsonPayload": {
    "message": "I'm an ERROR entry",
    "severity": "ERROR"
   },
   "resource": {
    "labels": {
     "project_id": "[YOUR PROJECT ID]",
     "instance_id": "[WHATEVER]",
     "zone": "[YOUR ZONE]"
    },
    "type": "gce_instance"
   }
  }
 ]
}

因此,您实际上是在 Stackdriver 上获取 JSON 有效负载的内容,但是由于严重性是在 JSON 有效负载 外部 定义的,或者如果您想在内部进行,则必须使用"severity": enum([NUMERICAL VALUE])

The numerical values of each log level are:

枚举
DEFAULT (0) 日志条目没有分配严重级别。
DEBUG (100) 调试或跟踪信息。
INFO (200) 日常信息,例如正在进行的状态或性能。
通知 (300) 正常但重要的事件,例如启动、关闭或配置更改。
WARNING (400) 警告事件可能会导致问题。
ERROR (500) 错误事件可能会导致问题。
CRITICAL (600) 严重事件会导致更严重的问题或中断。
警报 (700) 必须立即采取行动。
紧急 (800) 一个或多个系统无法使用。

因此,包括字段"severity": enum(500) 应将条目记录为错误,而不是回退到默认信息。

【讨论】:

  • 感谢您的回答!我对日志记录行为的结论如下。
  • 我已经单独回答了,无法再编辑之前的回复了。
【解决方案2】:

我对日志记录行为的结论如下,因为我现在已经开始工作了。

  • GKE 处理resource/logName 部分,这个不用担心。
  • 您可以记录任何 JSON 结构,它将进入 jsonPlayload
  • 纯文本日志行进入纯文本,同样适用,例如破坏JSON。在少数情况下,我在单个 textPayload 中看到了两个 JSON 日志行,即损坏的 JSON。是我的应用程序还是其他什么,我还不知道。
  • 有一些特殊的 JSON 字段(例如严重性)不会进入 jsonPayload。按照GCP logging entry 中的说明工作。

【讨论】:

    【解决方案3】:

    记录严重性的更新,可以在jsonPayload 中记录严重性,并且 fluentd 守护程序将其移动到 jsonPayload 的外部。它适用于使用严重性的字符串值而不是枚举,例如 "severity": "ERROR"jsonPayload 工作正常。

    【讨论】:

      猜你喜欢
      • 2017-12-14
      • 2020-07-19
      • 2016-09-16
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 2020-01-19
      相关资源
      最近更新 更多