Logstash-介绍
Elasti公司提供了ELK免费的开源软件,其中核心的产品就是ElasticSearch,Logstash 和Kibana 都是根据ElasticSearch 所衍生来的,更加方便对数据的检索。ElasticSearch和Kibana的搭建上一篇文章已经详细介绍搭建步骤,主要来看看Logstash的基本工作模式,Logstash主要是数据收集引擎,可以说结合Logback,将日志通过解析、转化成任何数据类型。
主要是类型于管道模式
- Inputs 将事件数据通过输入阶段生成事件
- Filters 滤器阶段对事件通过过滤和条件语句对事件进行处理
- Outputs 将事件数据发送到Elasticsearch中 更多关于Input plugins、Filters plugins、Out plugins的介绍可以去官方文档去查看Logstash Reference 8.7 | Elastic
这张图能很清楚的表达出Logstash在其中的作用,通过我们企业开发会将log交给ELK来处理,最原始的log文件交给Logstash来处理把原本非结构化的日志,变成结构化,并且通过Kibana可视化通过Elasticsearch索引查询数据。
pipeline概念
Logstash管道可以有多个,每个管道都是通过pipeline worker工作线程从队列里面获取事件,经过input、filter、output的处理;pipeline作为生产者和消费者的一个中心组件,负责数据流的驱动,支持若干个管道
pipeline核心的参数配置:
- pipeline.batch.size 批处理的大小
- pipeline.workers 管道线程大小
- pipeline.batch.delay 管道延迟时间,管道接收事件后等待新事件的事件。
pipeline管道配置模版
# This is a comment. You should use comments to describe
# parts of your configuration.
input {
...
}
filter {
...
}
output {
...
}
Logstash部署
- docker pull Logstash
//下载logstash7.3.0版本
docker pull docker.elastic.co/logstash/logstash:7.3.0
2. 直接启动logstash
docker run -di --name logstash -p 5044:5044 -p 9600:9600 容器id
- logstash.yml配置文件
//进入容器
docker exec -it CONTAINER ID /bin/bash
//automatic (定期检查配置是否已更改) interval检查频率
config:
reload:
automatic: true
interval: 3s
xpack:
management.enabled: false
monitoring.enabled: false
- pipeline.yml
//读取logstash_dev.conf配置类型
- pipeline.id: logstash_dev
path.config: "/usr/local/logstash/pipeline/logstash.conf"
- logstash_conf
input {
tcp {
mode => "server"
host => "127.0.0.1"
port => 5047
codec => json_lines
}
}
filter{
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "lxlxxx-system-logstash-dev-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
更改完配置,重新启动logstash
Spring boot 项目配置
- 引入logstash-logbock,jar包
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
</dependency>
- logback文件配置,创建logback-spiring.xml destination: 之前启动的logstash服务地址
<appender name="logstash" class ="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:5044</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="info">
<appender-ref ref="logstash"/>
</root>
- 启动Spring boot 项目,创建索引
- Discover就可以通过filter过滤查询需要的日志
踩坑地方
logstash一些踩坑的地方⚠️
- 这里配置es的host地址,默认是http://elaticsearch:9200,首先这个域名在logstash里面是ping不通的,后面我改为http://127.0.0.1:9200 我想这下应该可以了吧,结果还是不行,报错信息如下;
接着我又配置成自己本机的en0的地址,http://172.16.30.64:9200 发现终于可以了; 原因分析:原来docker容器内部访问是不能用localhost地址的,内部容器是网络 namespace 隔离,除非配置内部和外部网络通信模式;
- 看报错信息可以看出,索引不允许用大写命名,导致无法通过Es创建索引,需要改成小写;
总结
Spring boot引入ELK,对日志的检索的效率确实提升了很多,可视化的页面方便了很多,搭建也相对简单;如果引入es集群,和logsatsh多管道的配置,以及管道的filter规则,就需要根据业务逻辑来具体配置,但是首先你要知道最基础的搭建,才能进阶高级配置的搭建。