ELK即Elasticsearch、Logstash、Kibana,组合起来可以搭建线上日志系统,在目前这种分布式微服务系统中,通过ELK 会非常方便的查询和统计日志情况.

本文以pig 的upms 模块为例

  • Elasticsearch:用于存储收集到的日志信息;
  • Logstash:用于收集日志,应用整合了Logstash以后会把日志发送给Logstash,Logstash再把日志转发给Elasticsearch;
  • Kibana:通过Web端的可视化界面来查看日志。

image.png

搭建ELK环境

① 编写docker-compose.yml脚本启动ELK服务

  1. version: '3'
  2. services:
  3. elasticsearch:
  4. image: elasticsearch:6.4.0
  5. container_name: elasticsearch
  6. environment:
  7. - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
  8. - "discovery.type=single-node" #以单一节点模式启动
  9. - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
  10. volumes:
  11. - /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
  12. - /mydata/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
  13. ports:
  14. - 9200:9200
  15. kibana:
  16. image: kibana:6.4.0
  17. container_name: kibana
  18. links:
  19. - elasticsearch:es #可以用es这个域名访问elasticsearch服务
  20. depends_on:
  21. - elasticsearch #kibana在elasticsearch启动之后再启动
  22. environment:
  23. - "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
  24. ports:
  25. - 5601:5601
  26. logstash:
  27. image: logstash:6.4.0
  28. container_name: logstash
  29. volumes:
  30. - /mydata/logstash/upms-logstash.conf:/usr/share/logstash/pipeline/logstash.conf
  31. depends_on:
  32. - elasticsearch #kibana在elasticsearch启动之后再启动
  33. links:
  34. - elasticsearch:es #可以用es这个域名访问elasticsearch服务
  35. ports:
  36. - 4560:4560

② 创建对应容器挂载目录

  1. mkdir -p /mydata/logstash
  2. mkdir -p /mydata/elasticsearch/data
  3. mkdir -p /mydata/elasticsearch/plugins
  4. chmod 777 /mydata/elasticsearch/data # 给777权限,不然启动elasticsearch 可能会有权限问题

③ 编写日志采集logstash

/mydata/logstash目录创建 upms-logstash.conf

  1. input {
  2. tcp {
  3. mode => "server"
  4. host => "0.0.0.0"
  5. port => 4560
  6. codec => json_lines
  7. }
  8. }
  9. output {
  10. elasticsearch {
  11. hosts => "es:9200"
  12. index => "upms-logstash-%{+YYYY.MM.dd}"
  13. }
  14. }

④ 启动ELK 服务

docker-compose.yml 同级目录执行 docker-compose up -d

注意:Elasticsearch启动可能需要好几分钟,要耐心等待。

整合elk 日志收集 - 图2

⑤ logstash 安装json_lines 格式插件

  1. # 进入logstash容器
  2. docker exec -it logstash /bin/bash
  3. # 进入bin目录
  4. cd /bin/
  5. # 安装插件
  6. logstash-plugin install logstash-codec-json_lines
  7. # 退出容器
  8. exit
  9. # 重启logstash服务
  10. docker restart logstash

⑥ 访问宿主机5601 kibana

整合elk 日志收集 - 图3

服务整合Logstash (以UPMS模块为例)

① 添加pom 依赖

  1. <!--集成logstash-->
  2. <dependency>
  3. <groupId>net.logstash.logback</groupId>
  4. <artifactId>logstash-logback-encoder</artifactId>
  5. <version>5.3</version>
  6. </dependency>

② logback-spring.xml 新增appender

  1. <!--输出到logstash的appender-->
  2. <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
  3. <!--可以访问的logstash日志收集端口-->
  4. <destination>192.168.0.31:4560</destination>
  5. <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
  6. </appender>
  7. <root level="INFO">
  8. <appender-ref ref="LOGSTASH"/>
  9. </root>

③ 启动pig 在kibana中查询日志

整合elk 日志收集 - 图4
整合elk 日志收集 - 图5

扩展: 采集多个模块日志

:::warning 每个应用发送到不同的TCP 端口 这里注意logstash 的容器端口映射增加 :::

  1. input {
  2. tcp {
  3. add_field => {"service" => "upms"}
  4. mode => "server"
  5. host => "0.0.0.0"
  6. port => 4560
  7. codec => json_lines
  8. }
  9. tcp {
  10. add_field => {"service" => "auth"}
  11. mode => "server"
  12. host => "0.0.0.0"
  13. port => 4561
  14. codec => json_lines
  15. }
  16. }
  17. output {
  18. if [service] == "upms"{
  19. elasticsearch {
  20. hosts => "es:9200"
  21. index => "upms-logstash-%{+YYYY.MM.dd}"
  22. }
  23. }
  24. if [service] == "auth"{
  25. elasticsearch {
  26. hosts => "es:9200"
  27. index => "auth-logstash-%{+YYYY.MM.dd}"
  28. }
  29. }
  30. }

❤ 问题咨询

手势点击蓝字求关注简约风动态引导关注__2022-09-07+23_18_38.gif