使用ELK收集解析nginx日志和kibana可视化仪表盘

news/2024/7/7 6:39:24 标签: elk, elasticsearch, 大数据, nginx, 运维开发

文章目录

  • ELK生产环境配置
    • filebeat 配置
    • logstash 配置
  • kibana仪表盘配置
  • 配置nginx转发ES和kibana
  • ELK设置账号和密码

ELK生产环境配置

ELK收集nginx日志有多种方案,一般比较常见的做法是在生产环境服务器搭建filebeat 收集nginx的文件日志并写入到队列(kafka/redis),然后在另一台机器上消费队列中的日志数据并流转到logstash中进行解析处理,然后再输出到elasticsearch中,再由kibana展示到页面上。

虽然logstash也能直接收集日志,但因为filebeat比logstash更轻量级,不会耗费太多系统资源,因此适合在生产环境机器上部署filebeat

  • 生产环境机器:filebeat ---> redis
  • 日志处理机器:redis ---> logstash ---> elasticsearch ---> kibana

filebeat 配置

# vim filebeat-5.6.9/filebeat.yml

filebeat.inputs: #用于定义数据原型
- type: log #指定数据的输入类型,这里是log,即日志,是默认值,还可以指定为stdin,即标准输入
  enabled: true #启用手工配置filebeat,而不是采用模块方式配置filebeat
  paths: #用于指定要监控的日志文件,可以指定一个完整路径的文件,也可以是一个模糊匹配格式,如 nginx_*.log
    - /usr/local/nginx/logs/access.log
  # tags: ["access"]
  fields:
    app: www #表示www项目
    type: nginx-access #通过type区分哪种日志,这里表示是nginx的access日志
  fields_under_root: true

- type: log
  paths:
    - /usr/local/nginx/logs/error.log
  # tags: ["error"]
  fields:
    app: wap #表示wap项目
    type: nginx-error #通过type区分哪种日志,这里表示是nginx的error日志
  fields_under_root: true

name: "172.16.213.157" #设置filebeat收集的日志中对应主机的名字,如果配置为空,则使用该服务器的主机名。这里设置为IP,便于区分多台主机的日志信息。

output.redis: #输出到redis的配置
  enabled: true #表明这个模块是否启用
  hosts: ["192.168.0.1"]
  port: 6379
  password: "123456"
  key: "filebeat"
  db: 5
  datatype: list

output.kafka: #输出到kafka的配置
  enabled: false #表明这个模块是否启用
  hosts: ["172.16.213.51:9092", "172.16.213.75:9092", "172.16.213.109:9092"] #指定输出数据到kafka集群上,地址为kafka集群IP加端口号。
  version: "0.10"
  topic: '%{[fields][log_topic]}' #指定要发送数据给kafka集群的哪个topic,若指定的topic不存在,则会自动创建此topic。
  partition.round_robin:
    reachable_only: true
  worker: 2
  required_acks: 1
  compression: gzip
  max_message_bytes: 10000000
logging.level: debug #定义filebeat的日志输出级别,有critical、error、warning、info、debug五种级别可选,在调试的时候可选择debug模式。

启动filebeat并且不输出内容
nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &

查看redis:

redis-cli -h 192.168.0.1 -p 6379 -a 123456

192.168.0.1:6379[5]> llen filebeat
(integer) 101

192.168.0.1:6379[5]> lrange filebeat 0 0
1) "{\"@timestamp\":\"2023-08-30T06:21:56.896Z\",\"beat\":{\"hostname\":\"yourhost\",\"name\":\"yourhost\",\"version\":\"5.6.9\"},\"input_type\":\"log\",\"message\":\"{\\\"@timestamp\\\": \\\"2023-08-30T14:21:55+08:00\\\", \\\"remote_addr\\\": \\\"222.128.101.33\\\", \\\"remote_user\\\": \\\"-\\\", \\\"body_bytes_sent\\\": \\\"8637\\\", \\\"request_time\\\": \\\"2.554\\\", \\\"status\\\": \\\"200\\\", \\\"request_uri\\\": \\\"/user/info\\\", \\\"request_method\\\": \\\"POST\\\", \\\"http_referrer\\\": \\\"https://www.test.com/\\\", \\\"http_x_forwarded_for\\\": \\\"-\\\"}\",\"offset\":35407874,\"source\":\"/usr/local/nginx/logs/access.log\",\"type\":\"log\"}"

logstash 配置

下面是一个logstash从redis中读取日志数据并解析输出到ES的完整配置:

# vim logstash-7.17.12/config/logstash-from-redis-to-es.conf

input {
    redis {
        host => "192.168.0.1"
        port => 6379
        password => "123456"
        db => "5"
        data_type => "list"
        key => "filebeat"
    }
}

filter {
  if [app] == "www" { #如果是www项目(下面还可以再写else if ... ),对应上面filebeat配置信息的fields.app
    if [type] == "nginx-access" { #如果是nginx的access日志,对应上面filebeat配置信息的fields.type
      json { #解析json模块
          source => "message" #将message中的每个字段解析到一级节点
          remove_field => ["message","beat"] #经过上面source解析后,移除原本的message字段,避免日志内容冗余;beat字段也没啥用,所以也移除。
      }
      geoip { #根据ip地址解析 国家和城市 信息
          source => "remote_addr" #根据nginx日志的remote_addr字段解析
          target => "geoip" #解析后的结果放到这个字段中
          database => "/home/es/soft/GeoLite2-City.mmdb" #解析位置信息的数据库文件所在路径
          add_field => ["[geoip][coordinates]", "%{[geoip][longitude]}"] #添加字段:经纬度信息
          add_field => ["[geoip][coordinates]", "%{[geoip][latitude]}"]
      }
      mutate { #修改某个字段的数据,比如类型转换
          convert => ["[geoip][coordinates]", "float"]  
      }
    }
  }
}

output {
  elasticsearch {
      hosts  => ["http://192.168.0.212:9200","http://192.168.0.213:9200","http://192.168.0.214:9200"]
      index  => "logstash-%{type}-%{+YYYY.MM.dd}" #这里的 %{type} 是 filebeat配置信息的fields.type 对应的值
      user => "elastic" #ES账号
      password => "123456" #ES密码
  }
}

GeoLite2-City.mmdb 下载地址:https://download.csdn.net/download/rxbook/88274725

启动logstash:nohup ./bin/logstash -f ./config/logstash-from-redis-to-es.conf >/dev/null 2>&1 &

查看kibana收集到的数据:
在这里插入图片描述
在这里插入图片描述

kibana仪表盘配置

kibana dashboard 是一个统计数据展示面板,可以通过不同的维度进行统计和展示。
我这里用kibana7.17.12版本演示,不同版本的kibana界面可能不一样。进入kibana --> Visualize Library --> Create new visualization --> Lens

按时间维度统计请求数量:
在这里插入图片描述

按HTTP code统计请求数量:
在这里插入图片描述
统计所有请求总数:
在这里插入图片描述

统计访问次数最多的url:
在这里插入图片描述
最终效果:
在这里插入图片描述

nginxESkibana_146">配置nginx转发ES和kibana

如果需要使用80端口访问ES或kibana页面,可以在nginx中配置代理转发9200或5601端口,配置如下:

server {
    listen  80;
    server_name     es.xxxx.com;
    location / {
        proxy_pass      http://127.0.0.1:9200;
    }
}

server {
    listen  80;
    server_name     kibana.xxxx.com;
    location / {
        proxy_pass      http://127.0.0.1:5601;
    }
}

上面配置后就可以直接通过域名来访问kibana的页面(需要添加hosts)。

ELK设置账号和密码

修改ES的配置文件vi config/elasticsearch.yml 添加如下内容

http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

保存后重启ES,然后执行:./bin/elasticsearch-setup-passwords interactive,需要设置以下六种账户的密码elastic、apm_system、kibana、logstash_system、beats_system、remote_monitoring_user
输入y开始设置,六种密码设置完成后,需要再次重启ES。
在这里插入图片描述
然后打开ES的页面,账号:elastic,密码就是你刚才设置的密码。
在这里插入图片描述
设置kibana的密码,vi config/kibana.yml,添加:

elasticsearch.username: "elastic"
elasticsearch.password: "你在es中设置的密码"

然后重新启动kibana,再次访问,需要输入账号和密码。
在这里插入图片描述


http://www.niftyadmin.cn/n/4989889.html

相关文章

idea使用maven时的java.lang.IllegalArgumentException: Malformed \uxxxx encoding问题解决

idea使用maven时的java.lang.IllegalArgumentException: Malformed \uxxxx encoding问题解决 欢迎使用Markdown编辑器1、使用maven clean install -X会提示报错日志2、在Poperties.java文件的这一行打上断点3、maven debug进行调试4、运行到断点位置后,查看报错char…

使用vs2019+opencv4.3.0搭建开发环境笔记

使用vs2019opencv4.3.0搭建开发环境笔记 1.软件下载适配2.opencv适配三级目录 3.运行第一个demo报错 参考: 博文 1.软件下载适配 首先是需要下载安装vs2019,下载社区版免费,安装过程基本点击就可 vs2019官网 opencv下载 opencv4.3.0 2.o…

Java设计模式:一、六大设计原则-05:接口隔离原则

文章目录 一、定义:接口隔离原则二、模拟场景:接口隔离原则三、违背方案:接口隔离原则3.1 工程结构3.2 英雄技能调用3.2.1 英雄技能接口3.2.2 英雄:后裔3.2.3 英雄:廉颇 3.3 单元测试 四、改善代码:接口隔离…

Spring MVC: 请求参数的获取

Spring MVC 前言通过 RequestParam 注解获取请求参数RequestParam用法 通过 ServletAPI 获取请求参数通过实体类对象获取请求参数附 前言 在 Spring MVC 介绍中,谈到前端控制器 DispatcherServlet 接收客户端请求,依据处理器映射 HandlerMapping 配置调…

聊聊Http服务化改造实践

在微服务架构体系中远程RPC调用主要包括Dubbo与Http调用两个大类,由于Dubbo拥有服务注册中心,并且起服务的命名非常规范,使用包名.类名.方法名进行描述。 而http调用通常都是使用httpclient等相关类库,这些在使用上并没有问题&am…

python 读取 chrome 历史记录并写入表格

当前环境: Windows10 x64 Python 3.7 openpyxl 3.0.9 import sqlite3 import time import openpyxl# 1 获取历史记录 def get_history():conn sqlite3.connect(history) # 连数据库cursor conn.cursor() # 获取游标cursor conn.execute("SELECT id,u…

RunnerGo:轻量级、全栈式、易用性和高效性的测试工具

随着软件测试的重要性日益凸显,市场上的测试工具也日益丰富。RunnerGo作为一款基于Go语言研发的开源测试平台,以其轻量级、全栈式、易用性和高效性的特点,在测试工具市场中逐渐脱颖而出。 RunnerGo是一款轻量级的测试工具,使用Go…

Vite打包性能优化及填坑

最近在使用 Vite4.0 构建一个中型前端项目的过程中,遇到了一些坑,也做了一些项目在构建生产环境时的优化,在这里做一个记录,以便后期查阅。(完整配置在后面) 上面是dist文件夹的截图,里面的内容已经有30mb了&#xff…