You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

容器优化OS中JSON格式日志注入Google日志查看器的问题

解决Container Optimized OS上Stackdriver日志代理解析JSON日志的问题

我之前碰到过一模一样的情况,你的问题核心在于只配置了日志收集的source部分,却没有对应的match规则来把解析后的日志发送到Stackdriver,导致日志被收集后直接丢弃了。另外还要注意和默认配置的兼容性,下面是完整的修复步骤:

1. 编写正确的Fluentd配置文件

在/etc/stackdriver/logging.config.d/目录下创建一个新的配置文件(比如custom-container-json.conf,避免覆盖原有配置引发意外),内容如下:

<source>
  @type tail
  path /var/lib/docker/containers/*/*.log
  <parse>
    @type json
    # 如果你的日志里有自定义时间字段(比如"timestamp"),可以开启下面两行解析时间
    # time_key timestamp
    # time_format %Y-%m-%dT%H:%M:%SZ
  </parse>
  pos_file /var/log/google-fluentd/containers-json.log.pos
  tag docker.container.json
  read_from_head true
</source>

<match docker.container.json>
  @type google_cloud
  # 继承默认的Stackdriver配置(项目ID、认证、日志命名空间等)
  @include /etc/google-fluentd/google-fluentd.conf
  # 可选:添加自定义字段标识这部分日志来源
  # extra_fields {"parser": "custom-json"}
</match>

2. 检查配置语法合法性

重启服务前先验证配置有没有语法错误:

sudo google-fluentd --dry-run -c /etc/google-fluentd/google-fluentd.conf

如果输出没有报错,说明配置是合法的。

3. 禁用默认容器日志收集(可选但推荐)

默认的Stackdriver配置已经在收集容器日志,为了避免重复日志,你可以禁用默认的source:

sudo mv /etc/google-fluentd/config.d/container.conf /etc/google-fluentd/config.d/container.conf.disabled

4. 重启日志代理服务

sudo systemctl restart stackdriver-logging.service

5. 验证效果

运行一个输出JSON日志的测试容器:

docker run -d --name json-test busybox sh -c 'while true; do echo "{\"level\": \"info\", \"msg\": \"JSON log test\", \"time\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"}"; sleep 3; done'

之后去Google Log Viewer筛选日志,就能看到level、msg等字段被解析成结构化数据,而不是被包裹在message字段里了。

额外注意事项

  • 确保google-fluentd用户有读取/var/lib/docker/containers目录的权限,COS默认已经配置好,但如果遇到权限问题,可以用sudo ls -l /var/lib/docker/containers/检查权限。
  • 如果你的日志JSON格式不固定,可在parse块里添加strict: false参数允许非严格JSON(但不推荐,尽量保证日志格式规范)。

内容的提问来源于stack exchange,提问作者GamerAtmos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:32:43