容器优化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
相关产品推荐
相关产品推荐

