THE ELASTIC STACK 包括 Elasticsearch、Kibana、Beats 和 Logstash(也称为 ELK
Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。对于ElasticStack的数据采集部分的主要组件是Logstash、Beats。
Logstash可以从所有数据源采集数据,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。
而对于ElasticStack所有工作最开始都是要将数据导入到 Elasticsearch
中。Logstash将全部数据集中到一起,既可使用 Beats 采集来自应用和基础设施的指标,也可使用 Logstash
从第三方数据存储库中提取数据,方法十分多样。解析、充实、匿名化。LOGSTASH 输入、过滤器和输出 Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用 Grok
从非结构化数据中派生出结构,从 IP 地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。 日志、指标,还有更多 输入
采集各种样式、大小和来源的数据 数据往往以各种各样的形式,或分散或集中地存在于很多系统中。 Logstash 支持 各种输入选择
,可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS
服务采集数据。 过滤器 实时解析和转换数据 数据从源传输到存储库的过程中,Logstash
过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便更轻松、更快速地分析和实现商业价值。 利用 Grok
从非结构化数据中派生出结构 从 IP 地址破译出地理坐标 将 PII 数据匿名化,完全排除敏感字段
简化整体处理,不受数据源、格式或架构的影响 我们的过滤器库丰富多样,拥有无限可能。 输出 选择您的存储库,导出您的数据 尽管
Elasticsearch 是我们的首选输出方向,能够为我们的搜索和分析带来无限可能,但它并非唯一选择。Logstash 提供众多输出选择,您可以将数据发送到您要指定的地方,并且能够灵活地解锁众多下游用例。
Logstash 采用可插拔框架,拥有 200
多个插件。您可以将不同的输入选择、过滤器和输出选择混合搭配、精心安排,让它们在管道中和谐地运行。从自定义应用程序采集数据?没有看到所需的插件?Logstash 插件很容易构建。我们有一个极好的插件开发 API
和插件生成器,可帮助您开始创作并分享成果。假如 Logstash 节点发生故障,Logstash
会通过持久化队列来保证至少将运行中的事件送达一次。那些未被正常处理的消息会被送往死信队列 (dead letter queue)
以便做进一步处理。由于具备了这种吸收吞吐量的能力,现在您无需采用额外的队列层,Logstash
就能平稳度过高峰期。此外,我们还能让您充分确保自己采集管道的安全性。
而且由于简单的事情就该简单做,所以我们构建了端到端产品来针对各种用例为您提供更为简单的体验。
ElasticStack官网
Logstash官网
博客使用的环境版本为:
CentOS7
Elasticsearch:6.2.2
Kibana:6.2.2
Logstash:6.2.2
# docker pull elastic/logstash:6.2.2
创建目录:/root/logstash/config/pipeline
/root/logstash/config/
是logstash配置目录
该目录下要有:
logstash.yml配置文件
config:
reload:
automatic: true
interval: 3s
# 没有买xpack套件必须把以下两项配置设置为不启动,不然去检查授权会启动失败!
xpack:
management.enabled: false
monitoring.enabled: false
pipelines.yml配置文件指定使用哪些管道配置
pipelines.yml
- pipeline.id: test
path.config: "/usr/share/logstash/pipeline/test.conf"
# 注意这里的路径是docker容器内的路径哦
/root/logstash/config/pipeline/
是pipeline配置目录
test.conf自定义配置文件
input {
# 指定一个文件为输入源,暂时的测试配置
file {
path => ["/usr/share/logstash/pipeline/test.log"]
start_position => "beginning"
}
}
# 暂时指定的过滤
filter {
mutate {
gsub => ["message", "\r", ""]
}
dissect {
mapping => {"message" => "%{date} %{+date} [%{task} %{+task}] [%{type}] %{class} - %{info}"}
}
}
# 输出源指定为:终端、es服务器;
output {
stdout { codec => rubydebug }
#输出到es , es的IP指定为docker网络IP
elasticsearch { hosts => "172.17.0.2:9200" }
}
# docker run -d -p 5044:5044 -p 9600:9600 -it -v /root/logstash/config/:/usr/share/logstash/config/ -v /root/logstash/config/pipeline:/usr/share/logstash/pipeline --name logstash_server elastic/logstash:6.2.2
可以先打开一个终端查看logstash的实时日志
# docker logs -f logstash_server
创建test.conf管道配置里指定的输入源test.log文件,并往里写入内容
然后看logstash的日志:
转到Kibana查看index
以上状态可得知:Logstash将采集过的数据存放到Elasticsearch然后在Kibana监控、查询,整个流程工作正常。
用Logstash采集Logback的日志
修改管道配置Logstash会自动重新加载
调整Logstash的管道配置"test.conf"
input {
# 指定一个文件为输入源,暂时的测试配置
file {
path => ["/usr/share/logstash/pipeline/test.log"]
start_position => "beginning"
}
tcp {
##host:port就是上面appender中的 destination,这里其实把logstash作为服务,使用9600端口接收logback发出的消息
# host => "127.0.0.1"
# 监听的TCP端口一定要是创建docker容器时开放的,不然外部调不到。
port => 5044
mode => "server"
tags => ["tags"]
codec => json_lines
}
}
# 暂时指定的过滤
filter {
mutate {
gsub => ["message", "\r", ""]
}
dissect {
mapping => {"message" => "%{date} %{+date} [%{task} %{+task}] [%{type}] %{class} - %{info}"}
}
}
# 输出源指定为:终端、es服务器;
output {
stdout { codec => rubydebug }
#输出到es , es的IP指定为docker网络IP
elasticsearch { hosts => "172.17.0.2:9200" }
}
Gradle
<!-- // https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder
compile group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '6.2'
Maven
<!-- https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder -->
net.logstash.logback
logstash-logback-encoder
6.2
<!-- 增加Logstash日志采集配置-->
<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.91.129:5044</destination>
<includeCallerData>true</includeCallerData>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeCallerData>true</includeCallerData>
</encoder>
</appender>
<!-- ... ... -->
<!-- 日志输出级别-->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="rollingFile"/>
<appender-ref ref="stash"></appender-ref>
</root>
由此可见微服务项目日志成功被Logstash采集。