NGINX日志在Stackdriver中没有jsonPayload字段

问题描述 投票:1回答:2

我有一个基本的nginx部署服务于在GKE集群上运行的静态内容。我已根据here指令为集群配置了堆栈驱动程序日志记录(我为现有集群启用了日志记录),并且还启用了解释here的Stackdriver Kubernetes监控功能。日志本身似乎工作正常,因为我可以在Stackdriver中看到来自nginx的日志。

我正在尝试创建一些基于日志的指标,例如已完成的2xx请求的数量,但我在Stackdriver的日志条目中获取的是textPayload字段。根据我的理解,在群集上启用Stackdriver Monitoring会旋转一些Fluentd代理(我可以看到,如果我运行kubectl get pods -n kube-system),他们应该默认启用nginx日志解析器(根据文档here)。但是,Stackdriver中显示的任何日志条目都没有应该存在结构化日志的jsonPayload字段。

我正在使用nginx的默认log_format配置,并且我已经验证了默认的nginx解析器能够解析我的应用程序正在编写的日志(我将default Fluentd nginx parser plugin regular expression和我的应用程序中的日志条目复制到this tool并且它能够解析条目)

我确定我一定会遗漏一些东西,但我无法弄清楚是什么。

编辑:

作为参考,这是我的NGINX日志格式:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent"';

到目前为止我已尝试过以下内容:

  • 将我的k8s集群从1.11.5升级到1.11.6(由于版本1.11.4中的结构化日志记录问题,已在1.11.6中修复)
  • 从版本1.11.6降级到1.11.3
  • 使用GCP控制台(版本1.10.9)创建一个全新的集群,启用Stackdriver Monitoring和Stackdriver Logging选项并在其上部署我的应用程序。仍然没有jsonPayload场,只有textPayload

到目前为止,这些都没有解决它。

nginx google-kubernetes-engine google-cloud-stackdriver
2个回答
0
投票

你有机会运行Kubernetes 1.11.4吗?这是Beta release 1.11.4的一个已知问题。该修复程序可在Beta Update (Kubernetes 1.11.6)中找到。请确认您的版本。


0
投票

在与Google云端支持部门联系后,我们能够为此问题制定解决方法,但根本原因仍然未知。

解决方法是将NGINX日志格式本身定义为JSON字符串。这将允许Google-Fluentd解析器将有效负载正确解析为JSON对象。到目前为止,这是唯一对我有用的解决方案。

作为参考,我使用的日志格式是:

log_format json_combined escape=json
'{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request_method":"$request_method",'
'"request":"$request",'
'"status": "$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
access_log /var/log/nginx/access.log json_combined;
© www.soinside.com 2019 - 2024. All rights reserved.