用于 Google Kubernetes Engine 中 Stackdriver 日志记录的 JSON 格式

Iso*_*o J 8 google-cloud-platform kubernetes google-kubernetes-engine

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

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

{"severity": "DEBUG", "message": "I'm a debug entry"}
{"severity": "ERROR", "message": "I'm an error entry"}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jor*_*les 6

根据您提供的信息,我猜 fluentd 正在将您的整个 JSON 作为 jsonpayload 作为logEntry 传递,并提供 logName、资源类型和来自环境变量的其余所需信息。

最后,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"
   }
  }
 ]
}
Run Code Online (Sandbox Code Playgroud)

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

每个日志级别的数值为:

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

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