ELK的搭建和使用
1、什么是ELK
日志收集平台有多种组合方式:
ELK Stack
方式:Elasticsearch + Logstash + Filebeat + Kibana
,业界最常见的架构。
Elasticsearch + Logstash + Kafka + Kibana
,用上了消息中间件,但里面也有很多坑。
ELK Stack
的方式,这种方式对我们的代码无侵入,核心思想就是收集磁盘的日志文件,然后导入到
Elasticsearch。比如我们的应用系统通过 logback 把日志写入到磁盘文件,然后通过这一套组合的中间件就能把
日志采集起来供我们查询使用了。
ELK
不是一款软件,而是Elasticsearch
、Logstash
和 Kibana
三种软件产品的首字母缩写。这三者都是开源
软件,通常配合使用,而且又先后归于 Elastic.co 公司名下,所以被简称为 ELK Stack。根据 Google Trend 的信
息显示,ELK Stack 已经成为目前最流行的集中式日志解决方案。
-
Elasticsearch
:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具
有复杂的搜索功能。
-
Logstash
:数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置。
-
Kibana
:数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示。
2、简单的ELK架构
整体的架构图如下所示:
流程如下:
- 先使用
Filebeat
把日志收集起来,然后把数据再传给Logstash
。- 通过
Logstash
强大的数据清洗功能。- 最终把数据写入到
Elasticsearch
中。- 并由
Kibana
进行可视化。
3、安装部署
3.1 环境准备
相关软件的安装,请参考:
《Windows环境下Elasticsearch相关软件安装》
《Docker安装Elasticsearch相关软件安装》
《Linux环境下Elasticsearch相关软件安装》
3.2 配置 logstash
主要是监听某个端口来获取数据。
配置文件地址:https://www.elastic.co/guide/en/logstash/7.12/index.html
创建配置文件
$ cd /home/zhangshixing/elasticsearch/logstash-7.12.1
$ mkdir streamconf
$ cd streamconf
$ vim weblog.conf
配置文件内容如下:
input {
# 配置了 input 为 beats
beats {
port => "9900"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
mutate {
convert => {
"bytes" => "integer"
}
}
geoip {
source => "clientip"
}
# 修改了 useragent
useragent {
source => "user_agent"
target => "useragent"
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
}
}
output {
stdout {
codec => dots {}
}
elasticsearch {
hosts=>["192.168.94.186:9200"]
# 新增了索引名字
index => "apache_elastic_example"
}
}
启动
$ ./bin/logstash -f /home/zhangshixing/elasticsearch/logstash-7.12.1/streamconf/weblog.conf
3.3 配置Filebeat
主要是监听某个数据文件的变换来获取数据。
将监听到的数据发送到配置的logstash。
配置文件地址:
https://www.elastic.co/guide/en/beats/filebeat/7.12/configuring-howto-filebeat.html
日志文件准备
在/home/zhangshixing/logs/
目录下放置debug.log
,error.log
,info.log
三个文件。
创建配置文件
$ cd /home/zhangshixing/elasticsearch/filebeat-7.12.1-linux-x86_64
$ vim filebeat_apache.yml
配置文件内容如下:
filebeat.inputs:
- type: log
enabled: true
paths:
- /home/zhangshixing/logs/*.log
output.logstash:
hosts: ["192.168.94.186:9900"]
$ ./filebeat -e -c /home/zhangshixing/elasticsearch/filebeat-7.12.1-linux-x86_64/filebeat_apache.yml
3.4 测试
索引查看
数据读取
3.5 注意
注意下 logstash 中的 grok 过滤器,指定的 message 的格式需要和自己的日志的格式相匹配,这样才能将我们的
日志内容正确映射到 message 字段上。
例如我的 logback 的配置信息如下:
而我的 logstash 配置如下,和 logback 的 pettern 是一致的。
grok {
match => { "message" => "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n" }
}
4、ELK部署之使用redis消息队列
整体结构如下:
4.1 部署filebeat配置将日志数据输入到redis
这里首先需要安装redis,redis的安装请参考《Redis的安装》。
准备日志文件:
filebeat_redis.yml
配置文件配置内容:
filebeat.inputs:
- type: log
enabled: true
paths:
- /home/zhangshixing/redislogs/info.log
output.redis:
hosts: ["192.168.94.186:6379"]
key: "filebeat-redis"
启动:
$ ./filebeat -e -c /home/zhangshixing/elasticsearch/filebeat-7.12.1-linux-x86_64/filebeat_redis.yml
redis
查看:
4.2 部署logstash配置读入redis数据输入到ES集群中
$ mkdir redis
$ cd redis
$ vim redis.conf
redis.conf
配置文件的内容:
input {
redis {
host => "192.168.94.186"
port => "6379"
db => "0"
key => "filebeat-redis"
data_type => "list"
}
}
output {
stdout {}
elasticsearch {
hosts => "192.168.94.186:9200"
manage_template => false
index => "filebeat-redis-%{+YYYY.MM.dd}"
}
}
启动logstash:
$ ./bin/logstash -f /home/zhangshixing/elasticsearch/logstash-7.12.1/redis/redis.conf
查看索引建立情况:
$ curl -XGET "192.168.94.186:9200/_cat/indices?v"
查看数据:
$ curl -XGET "192.168.94.186:9200/filebeat-redis-2022.06.28/_search
5、Kafka+ELK 完成海量日志收集
整体结构:
5.1 部署filebeat配置将日志数据输入到kafka
这里首先需要安装kafka,kafka的安装请参考《Kafka的安装》。
创建两个topic
$ docker exec -it kafka /bin/sh
$ cd /opt/kafka_2.13-2.8.1
$ bin/kafka-topics.sh --zookeeper 192.168.94.186:2181 --create --topic app-log-collector --partitions 1 --replication-factor 1
$ bin/kafka-topics.sh --list --zookeeper 192.168.94.186:2181
# 我们可以查看一下topic情况
$ bin/kafka-topics.sh --zookeeper 192.168.94.186:2181 --topic app-log-collector --describe
filebeat配置文件
创建filebeat_kafka.yaml
配置文件
filebeat.inputs:
- type: log
enabled: true
paths:
- /home/zhangshixing/kafkalogs/info.log
output.kafka:
hosts: ["192.168.94.186:9092"]
topic: "app-log-collector"
partition.round_robin:
reachable_only: true
启动
$ ./filebeat -e -c /home/zhangshixing/elasticsearch/filebeat-7.12.1-linux-x86_64/filebeat_kafka.yml
查看kafka后台信息
$ docker logs -f kafka
5.2 部署logstash配置读入kafka数据输入到ES集群中
配置文件
$ mkdir kafka
$ cd kafka
$ vim kafka.conf
input {
kafka {
bootstrap_servers => "192.168.94.186:9092"
topics => "app-log-collector"
}
}
output {
stdout {}
elasticsearch {
hosts => ["192.168.94.186:9200"]
manage_template => false
index => "filebeat-kafka-%{+YYYY.MM.dd}"
}
}
启动
$ ./bin/logstash -f /home/zhangshixing/elasticsearch/logstash-7.12.1/kafka/kafka.conf
准备日志文件
往日志文件中插入数据,logstash后台信息:
查看索引建立情况:
$ curl -XGET "192.168.94.186:9200/_cat/indices?v"
查看数据:
$ curl -XGET "192.168.94.186:9200/filebeat-kafka-2022.06.29/_search
6、基于ELK搭建mysql慢查询、错误日志监控平台
6.1 mysql开启慢日志
这里为了操作方便,使用在 windows 上的 mysql 数据库。
如果 mysql 没有开启慢日志的,要先开启:
1、 登陆 mysql,查看 mysql 是否开启慢日志
$ show variables like '%slow_query_log%';
如图所示是没有开启的:
2、开启慢查询日志,修改配置文件C:\Program Files\MySQL\MySQL Server 5.5\my.ini
[mysqld]
# 开启慢日志
slow_query_log=1
# 日志位置
slow_query_log_file=C:\ProgramData\MySQL\MySQL Server 5.5\Data\WIN-NISNE13T693-slow.log
# 设置阈值
long_query_time=3
# 输出形式
log_output=FILE
3、重启mysql
4、再次登陆查询,已经开启
6.2 错误日志查询
$ show variables like 'log_error';
6.3 Filebeat
新建配置文件
filebeat_mysql.yml
配置文件:
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
index.number_of_replicas: 0
output.elasticsearch:
hosts: ["localhost:9200"]
setup.kibana:
host: "localhost:5601"
启用mysql模块
$ .\filebeat -e -c filebeat_mysql.yml modules enable mysql
在modules.d
目录下会生成mysql.yml
文件
# Module: mysql
# Docs: https://www.elastic.co/guide/en/beats/filebeat/7.x/filebeat-module-mysql.html
- module: mysql
# Error logs
error:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
#var.paths:
# Slow logs
slowlog:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
#var.paths:
修改mysql module配置文件mysql.yml
# Module: mysql
# Docs: https://www.elastic.co/guide/en/beats/filebeat/7.x/filebeat-module-mysql.html
- module: mysql
# Error logs
error:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["C:\\ProgramData\\MySQL\\MySQL Server 5.5\\Data\\WIN-NISNE13T693.err"]
# Slow logs
slowlog:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["C:\\ProgramData\\MySQL\\MySQL Server 5.5\\Data\\WIN-NISNE13T693-slow.log"]
加载kibana仪表盘
$ .\filebeat -e -c filebeat_mysql.yml setup
运行filebeat,注意这里不要把上述的指令中断后再执行,直接新开窗口执行,否则可能生成面板失败:
$ .\filebeat -e -c filebeat_mysql.yml
可视化查看
kibana主页 -> 添加数据 -> MySQL日志
,中点击检查数据,如果出现成功提示则说明配置成功。
点击检查数据:
点击MySQL 日志仪表板:
执行select sleep(5);
,查看结果: