如何让 Compute Engine 日志最终出现在结构化的 jsonPayload 而不是 textPayload 中?

如何让 Compute Engine 日志最终出现在结构化的 jsonPayload 而不是 textPayload 中?

我在 Linux VM 上运行 API,作为 Google Cloud 中的计算实例。该 API 正在使用 运行systemd,并且正在记录到syslog。我运行 StackDriver 日志记录代理以将日志传输到 StackDriver。

通过此 API,我将 Json 消息记录到标准输出。如果我读取/var/log/syslog(或执行systemctl status),我会看到这样的消息:

May  9 14:10:25 test-rulesapi-core-473n dotnet-example[4021]: {"customfield": "value"}

我想要实现的是让这个 Json 有效负载最终出现在jsonPayload日志条目的字段中,以便能够运行自定义查询。我尝试做的是修改 StackDriver 配置,以便它忽略添加到日志消息的前缀(带有日期和应用程序名称等),以便只有原始 Json 被发送到 StackDriver。配置如下所示(默认配置已被注释掉):

# format /^(?<message>(?<time>[^ ]*\s*[^ ]* [^ ]*) .*)$/
format /^(?<time>[^ ]*\s*[^ ]* [^ ]*)[^{]*(?<message>.*)$/

这似乎正确地提取了消息的 json 部分,但我的问题是,在日志条目中它仍然出现在字段中textPayload

例如,如果我使用检索一个特定的日志条目gcloud,它看起来像这样:

$ gcloud logging read "logName=projects/my-project/logs/syslog AND insertId=ajooj1g318gl2l"
---
insertId: ajooj1g318gl2l
labels:
  compute.googleapis.com/resource_name: myapi-473n
logName: projects/travix-production/logs/syslog
receiveTimestamp: '2018-05-09T14:00:03.877941542Z'
resource:
  labels:
    instance_id: '3565608832621021979'
    project_id: travix-production
    zone: europe-west1-c
  type: gce_instance
textPayload: '{"customfield": "value"}'
timestamp: '2018-05-09T14:00:03Z'

如何让 StackDriver 将 Json 对象放入jsonPayload适当的对象中以便能够使用自定义查询?

答案1

我发现您想要将 Json 对象打印到 jsonPayload 字段中以进行日志记录。

在阅读了一些文档后,我的想法是这样的。你应该研究一下解析器 [1],我也想和你分享一下 syslog 解析器插件如何解析日志 [2]。


[1]https://cloud.google.com/logging/docs/structured-logging#writing_your_own_parser

[2]https://docs.fluentd.org/parser/syslog

相关内容