es实战-收集Nginx日志可视化监控
需求场景:ES 集群通过 Nginx 做了网关代理,需要把访问 ES 集群的请求进行统计监控。
使用组件:Filebeat 收集,写入 ES 集群,通过 Kibana 的 dashboard 进行展示,即 ELK 的老本行,采用更轻量级的日志收集工具 Filebeat 而没有使用 Logstash。
1. Nginx
对 Nginx 默认的日志格式进行了微调,将默认的$time_local
修改为$time_iso8601
,日志变化如下所示:
#before 171.0.0.1 - - [11/Nov/2021:00:00:02 +0800] 1.300 0.982 200 731171 "POST /index1/_search?timeout=30s HTTP/1.1" "-" "axios/0.19.2" "-" #after 171.0.0.1 - - [2021-11-25T11:29:13+08:00] 0.008 0.008 200 137 "GET /index1/_search HTTP/1.1" "-" "python-urllib3/1.26.2" "-"
Nginx 日志每行12个字段含义如下:
字段 | 含义 |
---|---|
remote_addr | 客户端IP地址 |
- | 占位符 |
remote_user | 客户端登录用户名没有则置为占位符 - |
time | 访问时间和时区 |
request_time | 整个请求的总时间 |
upstream_response_time | Nginx向后端请求的时间 |
status | 请求返回的http状态码 |
body_bytes_sent | 发送给客户端的字节数 |
request | 请求的URI和HTTP协议 |
http_referer | 哪个页面链接访问 |
http_user_agent | 客户端访问信息,如浏览器、手机客户端等 |
http_x_forwarded_for | 客户端的真实ip通常web服务器放在反向代理的后面 |
2. Filebeat
Filebeat 配置比较简单,开箱即用,配置好 Input 为 Log,Output 为 ES 即可,如下所示:
filebeat.inputs: #=========================== Filebeat inputs ============================= - type: log enabled: true paths: - /usr/local/nginx/logs/access_whsh.log #=========================== Filebeat inputs ============================= filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: false #=========================== Filebeat inputs ============================= setup.template.settings: index.number_of_shards: 1 #index.codec: best_compression setup.template.name: "es-request-log" setup.template.pattern: "es-request-log-*" setup.template.enabled: false setup.template.overwrite: true setup.template.fields: "esrequestfields.yml" setup.ilm.enabled: false #=========================== Filebeat inputs ============================= output.elasticsearch: hosts: ["172.0.0.1:9200","172.0.0.2:9200","172.0.0.3:9200"] index: "es-request-log-%{+yyyy.MM.dd}" pipeline: "es-request-log" # Protocol - either `http` (default) or `https`. protocol: "https" #api_key: "id:api_key" username: "elastic" password: "changeme" ssl.verification_mode: "none" #=========================== Filebeat inputs ============================= processors: - add_host_metadata: when.not.contains.tags: forwarded - add_cloud_metadata: ~ - add_docker_metadata: ~ - add_kubernetes_metadata: ~
这里修改了 Filebeat 自带的默认日志模板和默认输出到 ES 的索引,并添加了一个 pipeline 用于对 Nginx 日志进行拆分处理(Filebeat默认将每行日志输出到message
字段)。
修改默认索引的模板字段fields.yml
,并将其导出录入到 ES 集群内作为记录日志索引的 template,具体做法可以参考官网:Load the Elasticsearch index template。
3. ES
ES 侧需要配置好存放日志数据索引的模板、ILM策略(非必须)、以及用到的 pipeline,名称和上一步 Filebeat 配置中要对应。
- 模板设置:
设置好别名、匹配的索引前缀、一些你想配置的 settings 以及字段结构:包括 Filebeat 自带的一些字段以及主要的日志字段message
和我们将通过 pipeline 拆解message
字段获取的一些将用于日志分析的字段。
- pipeline设置:
pipeline 主要作用是对message
字段拆解:
- 通过`grok`正则匹配方式匹配到`message`内部的每个字段,并将其抽出;
- 通过`script`可以加一些对抽出字段的判断,将请求聚类分析。
这里可以任意处理数据,获取自己想要的分析内容,或者也可以引入Logstash对数据进行处理。
4. Kibana
经过以上三步,数据已经进入到 ES 集群内,通过 Kibana 可以对数据分析结果进行可视化展示,忽略一些 Filebeat 自带的字段,数据内容如下所示:
我们可以对时间字段,某些 keyword 类字段进行聚合等统计数一些日志分析结果,并使用 dashboard 进行展示,部分示例如下:
- 统计请求的响应状态:
- 分类统计时间段的请求数量:
- 统计查询耗时的 pct (参考 jmeter 指标):
- 展示部分请求的部分字段(data table展示topN耗时等):
我有话说: