我在 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