流程说明

在这里插入图片描述

  • 应用APP生产日志,用来记录用户的操作
  • 通过Filebeat读取日志文件中的内容,并且将内容发送给Logstash,原因是需要对内容做处理
  • Logstash接收到内容后,进行处理,如分割操作,然后将内容发送到Elasticsearch中
  • Kibana会读取Elasticsearch中的数据,并且在Kibana中进行设计Dashboard,最后进行展示

Docker 部署 elk

先决条件

  1. 修改系统内存内核参数
vim /etc/sysctl.conf
vm.max_map_count=262144
  1. 运行内存要大于4G
    在这里插入图片描述

pull + run

docker pull sebp/elk

docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -itd --name elk sebp/elk

修改logstash配置文件

 1、进入elk容器
docker exec -it elk /bin/bash
 2、修改配置文件 改为如下
vi /etc/logstash/conf.d/02-beats-input.conf

这里的logstash接收到filebeat发来的日志,将message切割等数据处理操作,之后再将处理好的数据发送给elasticsearch

input {
        beats {
                port => "5044"
        }
}
filter {
        mutate {
                split => {"message"=>"|"}
        }
        mutate {
                add_field => {
                "userId" => "%{[message][1]}"
                "visit" => "%{[message][2]}"
                "date" => "%{[message][3]}"
                }
        }
        mutate {
                convert => {
                "userId" => "integer"
                "visit" => "string"
                "date" => "string"
                }
        }
}
output {
	elasticsearch {
		hosts => [ "192.168.135.10:9200"]
		index => ["logstash-wxf-demo-shopping"]
	}
}

仅保留02-beats-input.conf,别的要么改名要么删除,我这里是改名

root@6643ff42f735:/etc/logstash/conf.d# ls
02-beats-input.conf  10-syslog.conf.bak  11-nginx.conf.bak  30-output.conf.bak

退出容器

exit

开启服务

编写服务

我这里用go编写的一个程序模拟

package main

import (
	"fmt"
	"math/rand"
	"os"
	"strconv"
	"time"
)

func main() {
	for i := 0; i < 5; i++ {
		go LogCal()
		time.Sleep(time.Second)
	}
	select {}
}

func LogCal() {
	for {
		businessList := []string{"浏览页面", "评论商品", "加入收藏", "加入购物车", "提交订单", "使用优惠券", "领取优惠券", "搜索", "查看订单"}

		t := time.Now()
		rand.Seed(time.Now().UnixNano())

		userId := rand.Intn(9000000) + 1000000
		visit := businessList[rand.Intn(9)]
		date := fmt.Sprintf("%d-%d-%d %d:%d:%d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second())

		time.Sleep(time.Second * time.Duration(rand.Intn(5)+5))

		result := "DAU|" + strconv.Itoa(userId) + "|" + visit + "|" + date + "\n"
		LogInfo(result)
	}
}

func LogInfo(result string) {
	t := time.Now()
	orderTime := fmt.Sprintf("%d-%d-%d %d:%d:%d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second())
	pre := "[INFO] " + orderTime + " [Demo] - "
	result = pre + result

	filePath := "/usr/local/Demo/abc.log"
	file, err := os.OpenFile(filePath, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Printf("open file err=%v\n", err)
		return
	}
	defer file.Close()
	file.WriteString(result)
}

配置filebeat的yml文件

vi Demo.yml

填写如下内容,将收集到的日志发送给logstash

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/Demo/*.log
  fields:
    form: Demo-Shopping
  fields_under_root: true
setup.template.settings:
  index.number_of_shards: 1
  index.number_of_replica: 0
output.logstash:
  hosts: ["192.168.135.10:5044"]

运行顺序

docker restart elk
go run main.go
./filebeat -e -c Demo.yml

进入Elasticsearch-head查看数据

没有Elasticsearch-head去下载这个插件即可
在这里插入图片描述
在这里插入图片描述

可以看到我们想要的date,visit,userid都收集到了

进入Kibana创建数据看板

http://192.168.135.10:5601/

创建索引

在这里插入图片描述

创建柱形图

下面那个,上面的是饼图
在这里插入图片描述
选择数据源
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建饼图

在这里插入图片描述
选择数据源
在这里插入图片描述

在这里插入图片描述
右上角Save

创建数据表格

在这里插入图片描述
右上角Save

制作Dashboard仪表盘

在这里插入图片描述

在这里插入图片描述
最后保存即可

效果展示

在这里插入图片描述

Logo

更多推荐