Spring boot集成ELK,快速搭建

1,239 阅读3分钟

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索引查询数据。

0FE532C5-BB2A-49B9-896F-175EBB996CC7.png

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部署

  1. 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 6AF8515D-72E2-4939-8A88-252E48B3AE97.png

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 项目,创建索引

FCCA66D4-1BFA-4B5D-8184-D398A1B09697.png

  • Discover就可以通过filter过滤查询需要的日志

172CA442-948D-41F1-AD72-A3A4887EA5B3.png

踩坑地方

logstash一些踩坑的地方⚠️

20CE8D2B-E9D8-4A86-B728-DE7C6C3BB343.png

  1. 这里配置es的host地址,默认是http://elaticsearch:9200,首先这个域名在logstash里面是ping不通的,后面我改为http://127.0.0.1:9200 我想这下应该可以了吧,结果还是不行,报错信息如下;

F0DFBE90-B9F3-4DAC-97AB-3DBCBCA5FB2D.png 接着我又配置成自己本机的en0的地址,http://172.16.30.64:9200 发现终于可以了; 原因分析:原来docker容器内部访问是不能用localhost地址的,内部容器是网络 namespace 隔离,除非配置内部和外部网络通信模式;

  1. 看报错信息可以看出,索引不允许用大写命名,导致无法通过Es创建索引,需要改成小写; 880649AC-4545-496A-9F28-F4164840664A.png

总结

Spring boot引入ELK,对日志的检索的效率确实提升了很多,可视化的页面方便了很多,搭建也相对简单;如果引入es集群,和logsatsh多管道的配置,以及管道的filter规则,就需要根据业务逻辑来具体配置,但是首先你要知道最基础的搭建,才能进阶高级配置的搭建。