Docker搭建ELK+FileBeat
Docker搭建ELK+Filebeat分布式日志
1-为什么需要ELK
业务发展越来越庞大,服务器越来越多 各种访问日志、应用日志、错误日志量越来越多,导致运维人员无法很好的去管理日志 开发人员排查问题,需要到服务器上查日志,不方便 运营人员需要一些数据,需要我们运维到服务器上分析日志。
一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
一个完整的集中式日志系统,需要包含以下几个主要特点:
收集-能够采集多种来源的日志数据 传输-能够稳定的把日志数据传输到中央系统 存储-如何存储日志数据 分析-可以支持 UI 分析 警告-能够提供错误报告,监控机制 ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统。
2-ELK+FileBeat简介
ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件实现日志采集、分析、展示,但并非全部。
Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。
Filebeat隶属于Beats。目前Beats包含四种工具:
Packetbeat(搜集网络流量数据) Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据) Filebeat(搜集文件数据) Winlogbeat(搜集 Windows 事件日志数据)
3-搭建步骤
搭建步骤:
经过上述描述,大家也应该稍微有点了解了,想要搭建这个平台至少是需要3/4个软件的(可以没有filebeat)。
- elasticsearch 用于检索
- kibana 用于展示
- logstash 用于过滤
- filebeat 用于收集日志
本篇文章假定你已经有了docker环境,并且有基本的docker使用经验。
3.1-准备镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.6.1 |
3.2-创建elk网络
创建es-network网络主要用于在容器中可以直接通过容器名互相访问
docker network create es-network |
3.3-创建宿主机目录,用于与容器目录映射
根目录:/Users/fangpeng/src/elk,根据自身情况动态修改即可
授权:chmod 777 /Users/fangpeng/src/elk
. |
3.4-Docker安装ElasticSearch
1. 官网安装
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.6.1 |
2. 设置参数
在elasticsearch的docker版本文档中,官方提到了vm.max_map_count的值在生产环境最少要设置成262144。设置的方式有两种
永久性的修改,在/etc/sysctl.conf文件中添加一行:grep vm.max_map_count /etc/sysctl.conf # 查找当前的值。
vm.max_map_count=262144 # 修改或者新增 |
3. 创建并修改配置文件
在elasticsearch/config目录下创建elasticsearch.yml文件,内容如下:
# 配置es的集群名称 |
参数说明:
xpack.security.enabled: true
es从6.3之后内置了xpack模块,但是是默认关闭的
4. 启动命令
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --net elk -v /Users/fangpeng/src/elk/es/data:/usr/share/elasticsearch/data -v /Users/fangpeng/src/elk/es/config/elasticsearch.yml://usr/share/elasticsearch/config/elasticsearch.yml --privileged=true docker.elastic.co/elasticsearch/elasticsearch:7.6.1 |
5. 设置密码
# docker 进入容器 |
然后开始修改密码elastic
,apm_system
,kibana
,logstash_system
,beats_system
,remote_monitoring_user
等密码是一起修改的
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user. |
6. 测试是否成功
访问前,确保防火墙或安全组已经设置好
打开浏览器输入ip:9200
即可
然后输入用户名和密码
用户名: elastic |
成功后会看到以下内容
3.5-Docker安装Logstsh
1. 拉取官方镜像
docker pull docker.elastic.co/logstash/logstash:7.6.1 |
2. 创建挂载数据与配置文件
mkdir -p /Users/fangpeng/src/elk/logstash/config |
3. 修改配置文件
- logstash.conf
logstash pipeline 包含两个必须的元素:input和output,和一个可选元素:filter。
从input读取事件源,(经过filter解析和处理之后),从output输出到目标存储库(elasticsearch或其他) logstash.conf配置详情input {
beats {
port => 5044
ssl => false
}
}
filter {
grok {
# 筛选过滤
match => {
"message" => "(?<timestamp>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3}) %{GREEDYDATA:thread} %{LOGLEVEL:level} %{GREEDYDATA:class} - (?<msg>.*)"
}
remove_field => ["message"]
}
# 不匹配正则则删除,匹配正则用=~
if [level] !~ "(ERROR|WARN|INFO)" {
# 删除日志
drop {}
}
}
output {
stdout {
codec => rubydebug #控制台输出处理过后的数据
}
if [fields][logtype] == "pre"{
elasticsearch {
hosts => ["elasticsearch:9200"]
user => elastic
password => "123456"
index => "pre"
}
}
if [fields][logtype] == "prex"{
elasticsearch {
hosts => ["elasticsearch:9200"]
user => elastic
password => "123456"
index => "prex"
}
}
}
注:
- input 这里其实把logstash作为服 务,开启5044端口接收filebeat发出的消息
- filter 主要用来过滤日志文件处理成我们需要的数据
- grok 解析文本并构造 把非结构化日志数据通过正则解析成结构化和可查询化
- output 采集的日志要进行输出,将事件发送到特定目标 ,我这里配置的es,并使用账号密码
备注: 官方提供了很多正则的grok pattern可以直接使用: :https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns
grok debug工具: http://grokdebug.herokuapp.com
正则表达式调试工具: https://www.debuggex.com/
grok 里边有定义好的现场的模板你可以用,但是更多的是自定义模板,规则是这样的,小括号里边包含所有一个key和value,例子:(?<key>value),比如以下的信息,第一个我定义的key是data,表示方法为:?<key> 前边一个问号,然后用<>把key包含在里边去。value就是纯正则了,这个我就不举例子了。这个有个在线的调试库,可以供大家参考, |
我这里是按照JAVA日志格式进行编写的
{ |
- logstash.yml
# 不受限限制访问
http.host: 0.0.0.0
# 使用了es安全认证所以要配置es相关信息
xpack.monitoring.elasticsearch.hosts:
- http://ip:9200
# 使用x-pack安全认证
xpack.monitoring.enabled: true
# es账号
xpack.monitoring.elasticsearch.username: "elastic"
# es密码
xpack.monitoring.elasticsearch.password: "xxx"
4. 启动Logstash
docker run -p 5044:5044 --name logstash -d --net elk -v /Users/fangpeng/src/elk/logstash/config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:rw -v /Users/fangpeng/src/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:rw docker.elastic.co/logstash/logstash:7.6.1 |
5. 查看启动日志
docker logs -f logstash |
如上图已经启动成功
3.6-Docker安装Kibana
1. 拉取官方镜像
docker pull docker.elastic.co/kibana/kibana:7.6.1 |
2. 创建文件夹和配置文件
mkdir /Users/fangpeng/src/elk/kibana |
3. 修改配置
vim /Users/fangpeng/src/elk/kibana/config/kibana.yml |
配置文件
server.name: kibana |
4. 启动命令
docker run -d -p 5601:5601 --name=kibana --net elk -v /Users/fangpeng/src/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml docker.elastic.co/kibana/kibana:7.6.1 |
使用link参数,会在kibana容器hosts文件中加入elasticsearch ip地址,这样我们就直接通过定义的name来访问es服务
5. 启动测试
打开浏览器访问ip:5601
笔者在这边是mac系统,在这里遇到kibana无法连接到elasticsearch。
访问端口返回结果为
Kibana server is not ready yet |
解决方法如下
我这边查看日志是连接不上elasticsearch的问题
将配置文件kibana.yml中的elasticsearch.url改为正确的链接,默认为: http://elasticsearch:9200,改为http://自己的IP地址:9200
server.name: kibana |
我这里是将原本的elasticsearch改成了docker内部的IP,查看docker内部的IP命令如下
ip address |
再次访问ip:5601
,然后输入用户名和密码
elastic |
3.7-Docker安装Filebeat
1. 拉取官方镜像
docker pull docker.elastic.co/beats/filebeat:7.6.1 |
2. 在宿主机创建文件夹和文件
mkdir -p /Users/fangpeng/src/elk/filebeat/data |
3. 修改配置文件
filebeat.inputs: |
注: Logstash的配置
output: |
4. 启动命令
docker run --name filebeat -d --net elk -v /Users/fangpeng/Data/logs:/Users/fangpeng/Data/logs -v /Users/fangpeng/src/elk/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml -v /Users/fangpeng/src/elk/filebeat/data:/usr/share/filebeat/data docker.elastic.co/beats/filebeat:7.6.1 |
5. 查看启动日志是否成功
docker logs -f filebeat |
本文章主要架构为:
filebeat
读取logback
日志文件,发送到logstash
,再由logstash
发送到es
进行储存,最终kibana
展示
可以做到代码无侵入性,随时用随时撤
注意: 软件启动顺序,先启动es
,再启动kibana
,logstash
,filebeat
具体详细的介绍大家可以查一下资料,具体业务具体对待