NGINX日志在Stackdriver

时间:2019-01-16 18:30:54

标签: nginx google-kubernetes-engine google-cloud-stackdriver

我有一个基本的nginx部署,提供了在GKE集群上运行的静态内容。我已经按照说明here为集群配置了Stackdriver Logging(启用了对现有集群的日志记录),并且还启用了here所述的Stackdriver Kubernetes Monitoring功能。日志记录本身似乎运行良好,因为我可以在Stackdriver中看到nginx的日志。

我正在尝试创建一些基于日志的指标,例如已完成2xx请求的数量,但是我在Stackdriver中的日志条目中得到的只是textPayload字段。据我了解,在集群上启用Stackdriver Monitoring会启动一些Fluentd代理(我可以查看它们是否运行kubectl get pods -n kube-system),并且默认情况下它们应启用nginx日志解析器(根据文档{{3} })。但是,Stackdriver中显示的所有日志条目都没有jsonPayload字段,该字段应用于结构化日志。

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

我确定我一定会丢失一些东西,但我不知道是什么。

编辑:

作为参考,这是我的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

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

3 个答案:

答案 0 :(得分:0)

您是否正在运行Kubernetes 1.11.4? Beta release 1.11.4是一个已知问题。该修复程序在Beta Update (Kubernetes 1.11.6)中可用。 请确认您的版本。

答案 1 :(得分:0)

与Google Cloud支持人员联系后,我们能够针对此问题设计解决方法,尽管根本原因仍然未知。

解决方法是将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;

答案 2 :(得分:0)

我们以 Cloud Logging 直接理解的方式格式化日志,如下所示:

        log_format json_combined escape=json
          '{'
            '"httpRequest":{'
              '"requestMethod":"$request_method",'
              '"requestUrl":"$scheme://$host$request_uri",'
              '"requestSize":$request_length,'
              '"status":$status,'
              '"responseSize":$bytes_sent,'
              '"userAgent":"$http_user_agent",'
              '"remoteIp":"$remote_addr",'
              '"referer":"$http_referer",'
              '"latency":"${request_time}s",'
              '"protocol":"$server_protocol",'
              '"request":"$request",'
              '"remoteUser":"$remote_user"'
            '}'
          '}';

这样你就不需要使用 fluentd。您可以在这里找到参考:https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#HttpRequest