ELK Stack 日志平台搭建

前言

最近在折腾 ELK 日志平台,它是 Elastic 公司推出的一整套日志收集、分析和展示的解决方案。

专门实操了一波,这玩意看起来简单,但是里面的流程步骤还是很多的,而且遇到了很多坑。在此记录和总结下。

本文亮点:一步一图、带有实操案例、踩坑记录、与开发环境的日志结合,反映真实的日志场景。

日志收集平台有多种组合方式:

  • ELK Stack 方式:Elasticsearch + Logstash + Filebeat + Kibana,业界最常见的架构。
  • Elasticsearch + Logstash + Kafka + Kibana,用上了消息中间件,但里面也有很多坑,放到下一讲。

这次先讲解 ELK Stack 的方式,这种方式对我们的代码无侵入,核心思想就是收集磁盘的日志文件,然后导入到 Elasticsearch。

比如我们的应用系统通过 logback 把日志写入到磁盘文件,然后通过这一套组合的中间件就能把日志采集起来供我们查询使用了。

整体的架构图如下所示:

流程如下:

  • 先使用 Filebeat 把日志收集起来,然后把数据再传给 Logstash。
  • 通过 Logstash 强大的数据清洗功能。
  • 最终把数据写入到 Elasticsearch 中。
  • 并由 Kibana 进行可视化。

温馨提示:以下案例都在一台 ubuntu 虚拟机上完成,内存分配了 6G。

一、部署 Elasticsearch

数据库获取 elasticsearch 镜像:

docker pull elasticsearch:7.7.1

创建挂载目录:

mkdir -p /data/elk/es/{config,data,logs}

赋予权限:

chown -R 1000:1000 /data/elk/es

创建配置文件:

cd /data/elk/es/config
touch elasticsearch.yml
-----------------------配置内容----------------------------------
cluster.name: "my-es"
network.host: 0.0.0.0
http.port: 9200

启动 elasticsearch 容器:

docker run -it  -d -p 9200:9200 -p 9300:9300 --name es -e ES_JAVA_OPTS="-Xms1g -Xmx1g" -e "discovery.type=single-node" --restart=always -v /data/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/es/data:/usr/share/elasticsearch/data -v /data/elk/es/logs:/usr/share/elasticsearch/logs elasticsearch:7.7.1

验证 elasticsearch 是否启动成功:

curl http://localhost:9200

二、部署 Kibana 可视化工具

2.1 安装 Kibana

获取 kibana 镜像:

docker pull kibana:7.7.1

获取elasticsearch容器 ip:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' es

结果:172.17.0.2;

创建 kibana 配置文件:

mkdir -p /data/elk/kibana/
vim /data/elk/kibana/kibana.yml

配置内容:

#Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: ["http://172.17.0.2:9200"]
xpack.monitoring.ui.container.elasticsearch.enabled: true
2.2 运行 kibana
docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kibana -p 5601:5601 -v /data/elk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.7.1

访问 http://192.168.56.10:5601。这个 IP 是服务器的 IP。Kibana 控制台的界面如下所示,打开 kibana 时,首页会提示让你选择加入一些测试数据,点击 try our sample data 按钮就可以了。

Kibana 界面上会提示你是否导入样例数据,选一个后,Kibana 会帮你自动导入,然后就可以进入到 Discover 窗口搜索日志了。

三、部署 logstash 日志过滤、转换工具

3.1 安装 Java JDK
$ sudo apt install openjdk-8-jdk

修改 /etc/profile 文件:

sudo vim /etc/profile

添加如下的内容到你的 .profile 文件中:

# JAVA
JAVA_HOME="/usr/lib/jdk/jdk-12"
PATH="$PATH:$JAVA_HOME/bin"

再在命令行中打入如下的命令:

source /etc/profile

查看 java 是否配置成功:

java -version
3.2 安装 logstash

下载 logstash 安装包:

curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.7.1.tar.gz

解压安装:

tar -xzvf logstash-7.7.1.tar.gz

要测试 Logstash 安装,请运行最基本的 Logstash 管道。例如:

cd logstash-7.7.1
bin/logstash -e 'input { stdin { } } output { stdout {} }'

等 Logstash 完成启动后,我们在 stdin 里输入以下文字,我们可以看到如下的输出:

当我们打入一行字符然后回车,那么我们马上可以在 stdout 上看到输出的信息。如果我们能看到这个输出,说明我们的 Logstash 的安装是成功的。

我们进入到 Logstash 安装目录,并修改 config/logstash.yml 文件。我们把 config.reload.automatic 设置为 true。

另外一种运行 Logstash 的方式,也是一种最为常见的运行方式,运行时指定 logstash 配置文件。

3.3 配置 logstash

Logstash 配置文件有两个必需元素,输入(inputs)和输出(ouputs),以及一个可选元素 filters。输入插件配置来源数据,过滤器插件在你指定时修改数据,输出插件将数据写入目标。

我们首先需要创建一个配置文件,配置内容如下图所示:

创建 kibana 配置文件 weblog.conf:

mkdir -p /logstash-7.7.1/streamconf
vim /logstash-7.7.1/streamconf/weblog.conf

配置内容如下:

input {
  tcp {
    port => 9900
  }
}
 
filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
 
  mutate {
    convert => {
      "bytes" => "integer"
    }
  }
 
  geoip {
    source => "clientip"
  }
 
  useragent {
    source => "agent"
    target => "useragent"
  }
 
  date {
    match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
  }
}
 
output {
  stdout { }
 
  elasticsearch {
    hosts => ["localhost:9200"]
  }
}

在上面,我们同时保留两个输出:stdout 及 elasticsearch。事实上,我们可以定义很多个的输出。stdout 输出对于我们初期的调试是非常有帮助的。等我们完善了所有的调试,我们可以把上面的 stdout 输出关掉。

等更新完这个配置文件后,我们在另外一个 console 中发送第一个 log:

head -n 1 weblog-sample.log | nc localhost 9900

这个命令的意思:我们使用 nc 应用读取第一行数据,然后发送到 TCP 端口号 9900,并查看 console 的输出。

这里的 weblog-sample.log 为样例数据,内容如下,把它放到本地作为日志文件。

14.49.42.25 - - [12/May/2019:01:24:44 +0000] "GET /articles/ppp-over-ssh/ 
HTTP/1.1" 200 18586 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; 
rv:1.9.2b1) Gecko/20091014 Firefox/3.6b1 GTB5"

logstash 控制台打印出了 weblog-samle.log 中的内容:

这一次,我们打开 Kibana,执行命令,成功看到 es 中的这条记录。

GET logstash/_search

四、部署 Filebeat 日志收集工具

4.1 安装 Filebeat
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.1-linux-x86_64.tar.gz
tar xzvf filebeat-7.7.1-linux-x86_64.tar.gz

请注意:由于 ELK 迭代比较快,我们可以把上面的版本 7.7.1 替换成我们需要的版本即可。我们先不要运行 Filebeat。

4.2 配置 Filebeat

我们在 Filebeat 的安装目录下,可以创建一个这样的 filebeat_apache.yml 文件,它的内容如下,首先先让 filebeat 直接将日志文件导入到 elasticsearch,来确认 filebeat 是否正常工作。

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/vagrant/logs/*.log

output.elasticsearch:
  hosts: ["192.168.56.10:9200"]

paths 对应你的日志文件夹路径,我配置的是这个:/home/vagrant/logs/*.log,之前配置成 /home/vagrant/logs 不能正常收集。另外这里可以放入多个日志路径。

4.3 测试 Filebeat

在使用时,你先要启动 Logstash,然后再启动 Filebeat。

bin/logstash -f weblog.conf

然后,再运行 Filebeat, -c 表示运行指定的配置文件,这里是 filebeat_apache.yml。

./filebeat -e -c filebeat_apache.yml

运行结果如下所示,一定要确认下控制台中是否打印了加载和监控了我们指定的日志。如下图所示,有三个日志文件被监控到了:error.log、info.log、debug.log

我们可以通过这个命令查看 filebeat 的日志是否导入成功了:

curl http://localhost:9200/_cat/indices?v

这个命令会查询 Elasticsearch 中所有的索引,如下图所示,filebeat-7.7.1-* 索引创建成功了。因为我没有配置索引的名字,所以这个索引的名字是默认的。

在 kibana 中搜索日志,可以看到导入的 error 的日志了。不过我们先得在 kibana 中创建 filebeat 的索引(点击 create index pattern 按钮,然后输入 filebeat 关键字,添加这个索引),然后才能在 kibana 的 Discover 控制台查询日志。

创建查询的索引

搜索日志

4.4 Filebeat + Logstash

接下来我们配置 filebeat 收集日志后,输出到 logstash,然后由 logstash 转换数据后输出到 elasticsearch。

filebeat.inputs:

- type: log
  enabled: true
  paths:
    - /home/vagrant/logs/*.log

output.logstash:
  hosts: ["localhost:9900"]

修改 logstash 配置文件:

vim /logstash-7.7.1/streamconf/weblog.conf

配置了 input 为 beats,修改了 useragent:

input {  
  beats {
    port => "9900"
  }
}
 
filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
 
  mutate {
    convert => {
      "bytes" => "integer"
    }
  }
 
  geoip {
    source => "clientip"
  }
 
  useragent {
    source => "user_agent"
    target => "useragent"
  }
 
  date {
    match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
  }
}
 
output {
  stdout {
    codec => dots {}
  }
 
  elasticsearch {
    hosts=>["192.168.56.10:9200"]
    index => "apache_elastic_example"
  }
}

然后重新启动 logstash 和 filebeat。有个问题,这次启动 filebeat 的时候,只监测到了一个 info.log 文件,而 error.log 和 debug.log 没有监测到,导致只有 info.log 导入到了 Elasticsearch 中。

filebeat 只监测到了 info.log 文件

logstash 输出结果如下,会有格式化后的日志:

我们在 Kibana dev tools 中可以看到索引 apache_elastic_example,说明索引创建成功,日志也导入到了 elasticsearch 中。

另外注意下 logstash 中的 grok 过滤器,指定的 message 的格式需要和自己的日志的格式相匹配,这样才能将我们的日志内容正确映射到 message 字段上。

例如我的 logback 的配置信息如下:

logback 配置

而我的 logstash 配置如下,和 logback 的 pettern 是一致的。

grok {
    match => { "message" => "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n" }
  }

然后我们在 es 中就能看到日志文件中的信息了。如下图所示:

至此,Elasticsearch + Logstash + Kibana + Filebeat 部署成功,可以愉快地查询日志了~

后续升级方案:

  • 加上 Kafka。
  • 加上 Grafana 监控。
  • 链路追踪。

五、遇到的问题和解决方案

5.1 拉取 kibana 镜像失败

failed to register layer: Error processing tar file(exit status 2): fatal error: runtime: out of memory

原因是 inodes 资源耗尽 , 清理一下即可:

df -i
sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
curl -s https://raw.githubusercontent.com/ZZROTDesign/docker-clean/v2.0.4/docker-clean |
sudo tee /usr/local/bin/docker-clean > /dev/null && \
sudo chmod +x /usr/local/bin/docker-clean
docker-clean
5.2 拉取 kibana 镜像失败
docker pull runtime: out of memory

增加虚拟机内存大小。

5.3 Kibana 无法启动
"License information could not be obtained from Elasticsearch due to Error: No Living connections error"}

看下配置的 IP 地址是不是容器的 IP。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/400952.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PEARL: 一个轻量的计算短文本相似度的表示模型

| 💻 [code] | 💾 [data] | 🤗 PEARL-small | 🤗 PEARL-base | 论文 如何计算短文本相似度是一个重要的任务,它发生在各种场景中: 字符串匹配(string matching)。我们计算两个字符…

Stable Diffusion 模型下载:A-Zovya RPG Artist Tools(RPG 大师工具箱)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 A-Zovya RPG Artist Tools 模型是一个针对 RPG 训练的一个模型,可以生成一些 R…

win32 汇编读文件

做了2个小程序,没有读成功;文件打开了; .386.model flat, stdcalloption casemap :noneinclude windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include Comdlg32.inc includelib …

Js如何判断两个数组是否相等?

本文目录 1、通过数组自带方法比较2、通过循环判断3、toString()4、join()5、JSON.stringify() 日常开发,时不时会遇到需要判定2个数组是否相等的情况,需要实现考虑的场景有: 先判断长度,长度不等必然不等元素位置其他情况考虑 1…

【Java EE初阶二十一】http的简单理解(二)

2. 深入学习http 2.5 关于referer Referer 描述了当前页面是从哪个页面跳转来的,如果是直接在地址栏输入 url(或者点击收藏夹中的按钮) 都是没有 Referer。如下图所示: HTTP 最大的问题在于"明文传输”,明文传输就容易被第三方获取并篡改. …

使用Templ进行Go模板化

使用Templ在Go项目中高效生成动态内容的指南 动态内容生成是Web开发的一个基本方面。无论您是在构建网站、Web应用程序还是API,根据数据和模板生成动态内容的能力都至关重要。在Go编程世界中,一个名为“Templ”的强大工具简化了这一过程。在这份全面的指…

QT day2 2.21

1.使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 代码: #include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(pa…

c#创建安装windows服务

背景:最近在做设备数据对接采集时,遇到一些设备不是标准的Service-Client接口,导致采集的数据不够准确;比如设备如果中途开关机后,加工的数量就会从0开始重新计数,因此需要实时监控设备的数据,进行叠加处理;考略到工厂设备比较多,实时监听接口的数据为每秒3次,因此将…

Stable diffusion UI 介绍-文生图

1.提示词: 你希望图中有什么东西 2.负面提示词:你不希望图中有什么东西 选用了什么模型 使用参数 1.采样器 sampling method 使用什么算法进行采样 2.采样迭代步数 sampling steps 生成图像迭代的步数,越多越好,但是生成速度越大越…

微服务篇之监控

一、为什么要监控 1.问题定位 假设客户端查询一些东西的时候,需要经过网关,然后服务A调用服务H,服务H调用K,服务K调用MySQL,当查询不出来的时候,我们不能快速定位到底是哪个服务的问题,这就需要…

良好的 API 安全策略的重要性

根据 Cloudflare 2024 年 API 安全与管理报告,到 2024 年,API 请求占全球动态互联网流量的 57%,这证实 API 是现代软件开发的重要组成部分。但随着多年来它们的采用不断增加,相关的安全挑战也随之增加。 在过去两年中&#xff0c…

Java零基础 - 关系运算符

哈喽,各位小伙伴们,你们好呀,我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。 我是一名后…

Java基础API(2) String、StringBuilder详解

文章目录 🍸1. String类🍉🍉1.1 String概述🍉🍉1.2 String类的构造方法🍉🍉1.3 创建字符串对象的区别对比🍉🍉1.4 字符串的比较1.4.1 字符串的比较 🍉&#x…

【云原生】Docker 安全与CA证书生成

目录 容器的安全行问题 Docker 容器与虚拟机的区别 Docker 存在的安全问题 1.Docker 自身漏洞 2.Docker 源码问题 Docker 架构缺陷与安全机制 1. 容器之间的局域网攻击 2. DDoS 攻击耗尽资源 3. 有漏洞的系统调用 4. 共享root用户权限 Docker 安全基线标准 1. 内…

BOSS直聘招聘经验

招聘低端兼职岗位。流量很大,来的人通常实力也不足。 招聘高端兼职岗位。流量不多。来的人通常具备一定实力。 招聘高薪职位,流量一般,会有有实力的勾搭。 招聘低薪职位,流量一般。通常没什么实力。

【算法与数据结构】200、695、LeetCode岛屿数量(深搜+广搜) 岛屿的最大面积

文章目录 一、200、岛屿数量1.1 深度优先搜索DFS1.2 广度优先搜索BFS 二、695、岛屿的最大面积2.1 深度优先搜索DFS2.2 广度优先搜索BFS 三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、200、岛屿数量 1.1 深度优先搜…

第三百五十八回

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 013pickers2.gif 我们在上一章回中介绍了"如何实现Numberpicker"相关的内容,本章回中将介绍wheelChoose组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念…

ChatGPT丨成像光谱遥感技术中的AI革命:ChatGPT应用指南

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用,人工智…

解决弹性布局父元素设置高自动换行,子元素均分高度问题(align-content: flex-start)

案例&#xff1a; <view class"abc"><view class"abc-item" v-for"(item,index) in 8" :key"index">看我</view> </view> <style lang"less">.abc{height: 100px;display: flex;flex-wrap: …

[ Python+OpenCV+Mediapipe ] 实现对象识别

一、写在前面 本文所用例子为个人学习的小结&#xff0c;如有不足之处请各位多多海涵&#xff0c;欢迎小伙伴一起学习进步&#xff0c;如果想法可在评论区指出&#xff0c;我会尽快回复您&#xff0c;不胜感激&#xff01; 所公布代码或截图均为运行成功后展示。 二、本文内容…