Skip to main content

集成 CLS 日志服务

本文介绍 Nginx Ingress Controller 的 accesslog 的可视化。

采集 ingress-nginx 的 accesslog 到到腾讯云的 CLS日志服务,并结合 CLS 的仪表盘进行分析日志。

准备条件

容器服务控制台开启日志采集:

设置 Nginx 日志格式

values.yaml 中配一下 nginx 访问日志的格式,也设置下时区以便时间戳能展示当地时间(增强可读性):

controller:
config:
# nginx 日志落盘到日志文件,避免高并发下占用过多 CPU
access-log-path: /var/log/nginx/nginx_access.log
error-log-path: /var/log/nginx/nginx_error.log

# 自定义日志格式,在 $req_id 之后的是在生产环境中的经验积累增加的字段
log-format-upstream:
$remote_addr - $remote_user [$time_iso8601] $msec "$request"
$status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time
[$proxy_upstream_name] [$proxy_alternative_upstream_name] [$upstream_addr] [$upstream_response_length]
[$upstream_response_time] [$upstream_status] $req_id $namespace $ingress_name
$service_name $service_port $http_x_forwarded_for $host
extraEnvs:
- name: TZ
value: Asia/Shanghai

其中末尾处的这几个字段,是我另外加上的,目的是为了在 Nginx 访问日志中,能够定位 来源的 域名、Ingress 名称: $namespace $ingress_name $service_name $service_port $http_x_forwarded_for $host

创建 CLS 日志主题

在 CLS 日志服务控制台,创建自定义日志集 “Nginx访问日志”

再创建日志集,获取其 id

使用 CRD 进行日志采集配置

这里使用 YAML 编排进行配置:crd-logconfig.yaml

apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
metadata:
name: ingress-nginx-controller # 日志采集规则名称,如果是多个 nginx ingress 实例,这里不能冲突
spec:
clsDetail:
topicId: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # 替换日志主题的 ID
logType: fullregex_log
extractRule:
beginningRegex: (\S+)\s-\s(\S+)\s\[(\S+)\]\s(\S+)\s\"(\w+)\s(\S+)\s([^\"]+)\"\s(\S+)\s(\S+)\s\"([^\"]*)\"\s\"([^\"]*)\"\s(\S+)\s(\S+)\s\[([^\]]*)\]\s\[([^\]]*)\]\s\[([^\]]*)\]\s\[([^\]]*)\]\s\[([^\]]*)\]\s\[([^\]]*)\]\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)
logRegex: (\S+)\s-\s(\S+)\s\[(\S+)\]\s(\S+)\s\"(\w+)\s(\S+)\s([^\"]+)\"\s(\S+)\s(\S+)\s\"([^\"]*)\"\s\"([^\"]*)\"\s(\S+)\s(\S+)\s\[([^\]]*)\]\s\[([^\]]*)\]\s\[([^\]]*)\]\s\[([^\]]*)\]\s\[([^\]]*)\]\s\[([^\]]*)\]\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)
keys:
- remote_addr
- remote_user
- time_local
- timestamp
- method
- url
- version
- status
- body_bytes_sent
- http_referer
- http_user_agent
- request_length
- request_time
- proxy_upstream_name
- proxy_alternative_upstream_name
- upstream_addr
- upstream_response_length
- upstream_response_time
- upstream_status
- req_id
- namespace
- ingress_name
- service_name
- service_port
- http_x_forwarded_for
- host
inputDetail:
type: container_file
containerFile:
namespace: ingress-nginx # nginx ingress 所在命名空间
workload:
kind: deployment
name: ingress-nginx-controller # 选中 nginx ingress controller 的 deployment 名称
container: controller
logPath: /var/log/nginx
filePattern: nginx_access.log

  • 必须替换的配置是 topicId,即日志主题 ID,表示采集的日志将会吐到该 CLS 日志主题里。
  • 根据自己实际情况选择配置采集标准输出还是日志文件,nginx ingress 默认是将日志输出到标准输出,但也可以像 日志轮转 这里介绍的一样将日志落盘到日志文件。

TKE 容器服务 -> 日志,就可以自动创建出采集策略:

配置索引

查看日志

实时查看日志

后台的检索分析,能够实时查看 Nginx 访问日志:

可视化仪表板1:K8S 监控大盘

通过实时收集的 ingress-nginx accesslog,可以创建两种可视化大盘:

  1. K8S 监控大盘:反应的是业务状态码、成功率、接口TOP10等业务行为
  2. K8S 访问大盘:反应的是客户端行为,TOP客户端IP,监控爬虫封堵高频访问IP,全球、全国客户端分布,客户端类型等

PV,UV,状态码分布:

PV,UV,RT(响应时间) 趋势图:

接口URL,域名请求 TOP10 等:

可视化仪表板2:K8S 访问大盘

PV,UV 国家、省份间的地域分布:

PV,UV 趋势图:

客户端真实 IP数(反刷反爬虫防御

日志预警

当然,还可以根据日志进行部署预警,例如状态码 5xx > 1% 告警:

订阅报表

按日、周、月订阅【日志报表】,时刻掌握【业务动态、业务流量PV、UV】

总结

使用 CLS日志服务实时收集 ingress-nginx 日志后,可以通过创建可视化仪表板对日志进行有效分析,从而有助于监控业务状态、优化业务行为、防范爬虫、防御异常盗刷,以及了解客户端分布和类型等情况,为业务运营和管理提供有力支持。

Tips

日志只有赋予了可视化能力,才更具有价值。

参考文档