介绍
Logstash是一个数据同步工具,在ELK(Elasticsearch + Logstash + Kibana)技术栈中解决数据同步问题。日常项目中数据主要存储在MYSQL、日志文件中,通过Logstash可以将MYSQL、日志文件、redis等多种数据源的数据同步到ES,这样就可以通过ES搜索数据。
MYSQL同步数据到Elasticsearch,主要有下面几种策略:
- 双写策略,更新MYSQL数据的同时通过ES API直接写入数据到ES (同步方式)
- 通过Logstash同步数据到ES (异步方式)
- 通过订阅MYSQL Binlog,将数据同步到ES (异步方式)
这里主要介绍Logstash如何同步数据。
安装
环境依赖
依赖Java 8 或者 Java 11环境,可以是更高的版本。
压缩包安装
通过下面地址下载最新版本的压缩包(linux/mac系统下载tar.gz, windows下载zip)
https://www.elastic.co/cn/downloads/logstash
将压缩包解压到自定义目录即可。
docker 安装
下载镜像
docker pull logstash:7.5.1
启动
docker run -d --name=logstash logstash:7.5.1
拷贝数据,授予权限
docker cp logstash:/usr/share/logstash /data/elk7/
mkdir /data/elk7/logstash/config/conf.d
chmod 777 -R /data/elk7/logstash
测试
# 切换到安装目录
cd logstash-7.7.1
# 执行命令
bin/logstash -e 'input { stdin { } } output { stdout {} }'
等一会,logstash启动后在控制台输入tizi365.com 按回车,可以看到类似下面的输出
tizi365.com
{
"@timestamp" => 2020-06-09T15:45:38.147Z,
"message" => "tizi365.com",
"@version" => "1",
"host" => "jogindembp"
}
配置文件
可以将Logstash的配置都写入一个配置文件中,下面是配置文件的格式,主要有三部分组成
# 输入插件配置, 主要配置需要同步的数据源,例如:MYSQL
input {
}
# 过滤器插件配置, 主要用于对输入的数据进行过滤,格式化操作,filter是可选的。
filter {
}
# 输出插件配置,主要配置同步数据的目的地,例如同步到ES
output {
}
提示:logstash的input、filter、output都是由各种插件组成。
示例1:
input {
stdin {}
}
output {
stdout { codec => rubydebug }
}
说明:
这个配置文件的意思是,从控制台标准输入(stdin)接收输入,然后直接将结果在控制台标准输出(stdout)打印出来。
通过配置文件启动logstash
bin/logstash -f test.conf
同步nginx日志到ES
下面是将Nginx的访问日志同步到ES中的配置
配置文件名:logstash-nginx-log.conf
input {
# 实时监控日志文件的内容,类似tail -f 命令的作用
file {
# nginx日志文件路径
path => [ "/data/nginx/logs/nginx_access.log" ]
start_position => "beginning"
ignore_older => 0
}
}
# 配置过滤器对日志文件进行格式化
filter {
# 使用grok插件对日志内容进行格式化,提取日志内容,方便转换成json格式
# %COMBINEDAPACHELOG 是grok插件内置的apache日志内容处理模板,其实就是一些表达式,用来格式日志文本内容,也可以格式化Nginx日志
grok {
match => {
"message" => "%{COMBINEDAPACHELOG}"
}
}
}
# 配置输出目的地,这里配置同步到ES中
output {
elasticsearch {
# es服务器地址
hosts => ["127.0.0.1:9200"]
# 目标索引
index => "nginx-access"
}
}
启动logstash
bin/logstash -f logstash-nginx-log.conf
Logstash 工作原理
Logstash同步数据,主要有三个核心环节:inputs → filters → outputs,流程如下图。
inputs模块负责收集数据,filters模块可以对收集到的数据进行格式化、过滤、简单的数据处理,outputs模块负责将数据同步到目的地,Logstash的处理流程,就像管道一样,数据从管道的一端,流向另外一端。
提示:inputs/filters/outputs是通过插件机制扩展各种能力。
inputs
inputs可以收集多种数据源的数据,下面是常见的数据源:
- file - 扫描磁盘中的文件数据,例如: 扫描日志文件。
- mysql - 扫描Mysql的表数据
- redis
- Filebeat - 轻量级的文件数据采集器,可以取代file的能力。
- 消息队列kafka、rabbitmq等 - 支持从各种消息队列读取数据。
filters
filters是一个可选模块,可以在数据同步到目的地之前,对数据进行一些格式化、过滤、简单的数据处理操作。
常用的filters功能:
- grok - 功能强大文本处理插件,主要用于格式化文本内容。
- drop - 丢弃一些数据
outputs
Logstatsh的最后一个处理节点,outputs负责将数据同步到目的地。
下面是常见的目的地:
- elasticsearch
- file - 也可以将数据同步到一个文件中
Codecs
codecs就是编码器,负责对数据进行序列号处理,主要就是json和文本两种编码器。
参考
[1] Logstash 教程
[2] docker安装logstash
[3] Logstash 工作原理