ELK 到底是什么呢?

“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化,后面加入了一系列轻量型的单一功能数据采集器,并把它们叫做 Beats。
image.png

ELK能做什么?

一套解决方案,应该清楚它能为我们做什么,能解决什么问题,是对方案选型的重中之重。以下介绍几个应用场景。
1、应用出现故障,需要通过日志排查故障信息。当应用已部署了多个环境时,这时排查的难度和耗时就是一个巨大的损耗。而ELK就可以对多个环境的日志进行收集,过滤,存储,检错,可视化。只需要查的kibana上的日志信息,就可以找出故障所在。
2、针对应用在生产环境上的表现需要数据支撑,如访客数,功能调用量,出错率等等。此类数据的收集,像ELK这样对应用无入侵,且功能强大的的开源软件。
简单来说,日志是记录一个服务的所有行为的数据。而ELK则对服务行为数据进行分析。应该要考虑几个问题,那就是日志的输出是否合理?是否符合规范?怎样才能输出我们想要的日志?在研发过程中,那些什么内容应该被输出到日志?这些问题,需要考虑清楚,这将影响ELK的配置和部署。

你会学到什么?

搞懂ELK并不是一件难事 - 图2

完整日志系统基本特征

搞懂ELK并不是一件难事 - 图3

ELK架构

image.png

ELK部署

docker部署https://github.com/1769974308/docker-middleware-environment/tree/master/ELK
版本:7.14.2

docker方式启动ELK

  1. [root@VM-24-15-centos ELK]# ll
  2. total 12
  3. drwxr-xr-x 3 root root 4096 Jan 13 11:22 config
  4. -rw-r--r-- 1 root root 1353 Jan 13 16:46 docker-compose.yml
  5. -rw-r--r-- 1 root root 161 Jan 13 11:22 README.md
  6. [root@VM-24-15-centos ELK]# docker-compose -f docker-compose.yml up -d
  7. Creating network "elk_middleware-network" with driver "bridge"
  8. Creating elasticsearch ... done
  9. Creating kibana ... done
  10. Creating logstash ... done
  11. [root@VM-24-15-centos ELK]# docker ps -a
  12. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
  13. NAMES8da47fae04b9 logstash:7.14.2 "/usr/local/bin/dock…" 14 seconds ago Up 13 seconds 0.0.0.0:5000->5000/tcp, 0.0.0.0:5044->5044/tcp, 0.0.0.0:9600->9600/tcp, 0.0.0.0:5000->50
  14. 00/udp logstash4d8ce85ec8e3 kibana:7.14.2 "/bin/tini -- /usr/l…" 14 seconds ago Up 13 seconds 0.0.0.0:5601->5601/tcp
  15. kibana42dcc5d255d5 elasticsearch:7.14.2 "/bin/tini -- /usr/l…" 15 seconds ago Up 14 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp
  16. elasticsearch3c44827fb1fb nacos/nacos-server:2.0.3 "bin/docker-startup.…" 2 weeks ago Up 2 weeks 0.0.0.0:8848->8848/tcp, 0.0.0.0:9555->9555/tcp, 0.0.0.0:9848->9848/tcp
  17. nacos-standalone-mysql[root@VM-24-15-centos ELK]#

访问kibana

kibana是一个web应用,可以通过5601端口访问。只需要在浏览器中指定kibana运行的机器,然后指定端口号即可。例如 http://ip:5601
image.png
检查kibana状态
image.png

访问elasticsearch

image.png

安装ElasticSearch Head插件

Chrome应用商店https://chrome.google.com/webstore/detail/elasticsearch-head/ffmkiejjmecolpfloofpjologoblkegm?hl=zh-CN
image.png

LogBack+ELK整合

logback-logstash的整合依赖包

  1. <dependency>
  2. <groupId>net.logstash.logback</groupId>
  3. <artifactId>logstash-logback-encoder</artifactId>
  4. <version>5.1</version>
  5. </dependency>

logback-spring.xml配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <!-- https://github.com/spring-projects/spring-boot/blob/v1.4.2.RELEASE/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml -->
  4. <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
  5. <property name="APP_NAME" value="FlashSaleApplication"/>
  6. <property name="LOG_PATH" value="${user.home}/${APP_NAME}/logs"/>
  7. <property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
  8. <appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender">
  9. <file>${LOG_FILE}</file>
  10. <encoder>
  11. <pattern>${FILE_LOG_PATTERN}</pattern>
  12. </encoder>
  13. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  14. <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  15. <maxHistory>7</maxHistory>
  16. <maxFileSize>50MB</maxFileSize>
  17. <totalSizeCap>20GB</totalSizeCap>
  18. </rollingPolicy>
  19. </appender>
  20. <conversionRule conversionWord="ip" converterClass="com.taotao.utils.IPConverterConfig" />
  21. <appender name="LOG_STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
  22. <!--logstash日志收集ip和端口-->
  23. <destination>82.157.137.229:5044</destination>
  24. <queueSize>1048576</queueSize>
  25. <!--日志输出编码-->
  26. <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
  27. <providers>
  28. <timestamp>
  29. <timeZone>UTC</timeZone>
  30. </timestamp>
  31. <pattern>
  32. <pattern>
  33. {
  34. "app_date": "%d{yyyy-MM-dd HH:mm:ss:SSS}",
  35. "app_ip": "%ip",
  36. "app_thread": "%thread",
  37. "app_traceId": "%X{traceId}",
  38. "app_level": "%level",
  39. "app_logger": "%logger{40}",
  40. "app_message": "%msg%n"
  41. }
  42. </pattern>
  43. </pattern>
  44. </providers>
  45. </encoder>
  46. </appender>
  47. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  48. <encoder>
  49. <charset>utf8</charset>
  50. <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS}|%ip|%thread|%X{traceId}|%level|%logger{36}|%msg%n</pattern>
  51. </encoder>
  52. </appender>
  53. <root level="INFO">
  54. <appender-ref ref="LOG_STASH"/>
  55. <appender-ref ref="CONSOLE"/>
  56. <appender-ref ref="APPLICATION"/>
  57. </root>
  58. </configuration>

Logstash配置

  1. [root@VM-24-15-centos pipeline]# cat logstash.conf
  2. input {
  3. tcp {
  4. host => "0.0.0.0"
  5. port => 5044
  6. codec => json_lines
  7. }
  8. }
  9. filter {
  10. mutate {
  11. split => ["app_message","|"]
  12. }
  13. if [app_message][0] {
  14. mutate {
  15. add_field => {
  16. "app_keyword" => "%{[app_message][0]}"
  17. }
  18. }
  19. }
  20. if [app_message][1] {
  21. mutate {
  22. add_field => {
  23. "app_keynote" => "%{[app_message][1]}"
  24. }
  25. }
  26. }
  27. if [app_message][2] {
  28. mutate {
  29. add_field => {
  30. "app_params" => "%{[app_message][2]}"
  31. }
  32. }
  33. }
  34. }
  35. output {
  36. elasticsearch {
  37. hosts => "http://elasticsearch:9200"
  38. index => "flash-sale-%{+YYYY.MM.dd}"
  39. ecs_compatibility => disabled
  40. }
  41. }
  42. [root@VM-24-15-centos pipeline]#

启动项目查看elasticsearch数据

image.png
image.png

Kibana观察日志

创建索引模式

浏览器中指定端口号5601来访问 Kibana UI 页面
image.png
指定一个索引模式来匹配一个或多个 Elasticsearch 索引名称,星号 () 匹配0或多个索引名称中的字符。
image.png
可以选择索引中包含时间戳的字段。Kibana 会读取索引映射,列出包含时间戳的所有字段
image.png
点击 Create 增加索引模式,默认情况下,第一个模式被自动配置为默认的。当索引模式不止一个时,可以通过点击 *Management > Index Patterns
索引模式题目上的星星图标来指定默认的索引模式。
image.png
全部设置完毕!Kibana 连接了 Elasticsearch 的数据。展示了一个匹配到的索引的字段只读列表

kibana可视化

开始探索数据,准备挖掘数据。

在Discover页探索和浏览数据

image.png
image.png

在Visualize页做数据图表映射

image.png

在Dashboard页创建并查看自定义仪表板

image.png

项目示例源码

docker elk 搭建:https://github.com/1769974308/docker-middleware-environment/tree/master/ELK

logback日志工程:https://github.com/1769974308/small-skill-learning/tree/master/elk