1 概述
在微服务架构中, 会部署众多的应用, 其中有基础应用, 比如: 网关, 服务发现等. 同时还有大量的业务应用. 所以, 如何有效的收集它们的日志, 并且方便查询, 同时提供友好的可视化展示, 对于应对微服务架构的复杂性有很大的帮助. 在高复杂度的系统中, 对于定位线上问题, 日志非常重要. ELK(ElasticSearch+Logstash+Kibana), 可以使用说是目前最流行的日志平台构建方案, 之所以深受开发者喜爱, 主要是因为它解决了大规模系统的日志收集的各种痛点.
2 ELK Stack
ELK(ElasticSearch+Logstash+Kibana), 主要包含三个组件:
- ElasticSearch
- Logstash
- Kibana
- 2.1 ElasticSearch
ElasticSearch 是一个开源的分布式的搜索引擎, 它主要基于 Apache Lucene. 在整个 ELK Stack 中, ElasticSearch 是最核心的组件, 它存储数据, 并且提供了许多灵活而实用的 Rest API, 所以, 上层应用可以根据需要去查询数据, 使用数据, 分析数据. 在日志平台中, 所有的日志数据都存储到 ElasticSearch 中, 借助其强大的搜索能力, 可以很灵活的查询日志.
2.2 Logstash
Logstash 主要用于收集数据, 并将数据保存到 ElasticSearch 中.
Logstash 有丰富插件, 并且易于扩展, 所以, 可以使用 Logstash 收集到数据后, 可以做很多处理, 最终再将数据输出到 ElasticSearch 中. 在日志平台中, 它主要复杂采集应用的日志.
2.3 Kibana
Kibana 主要负责读取 ElasticSearch 中的数据, 并进行可视化展示. 并且, 它还自带 Tool, 可以方便调用 ElasticSearch 的 Rest API. 在日志平台中, 我们通过 Kibana 查看日志.
3 架构
使用 ELK 构建了一个日志平台架构:
这是一个最简化版的日志收集架构, 很多基于 ELK 的日志架构是从它演化而来, 核心的问题就是日志数据都保存到 ElasticSearch 中. 比如说, 可以先将日志收集到 Kafka 中, 然后再由 Logstash 采集数据输出到 ElasticSearch 中, 引入了 Kafka, 就给使用数据增加了很多可能性.
4 搭建日志平台
系统: Ubuntu16.06 64
去官网下载 ElasticSearch,Logstash,Kibana, 注意尽量保持版本一致, 此处使用 6.0 的大版本, 为了便于演示, 全部 ELK 程序和 Java 应用都安装到一台机器上, 目录如下:
- noone@ubuntu:/opt$ tree -L 1
- .
- elasticsearch-6.0.0
- gs-spring-boot-0.1.0.jar
- kibana-6.0.1-linux-x86_64
- logs
- logstash-6.0.1
复制代码
4.1 配置
为了方便管理, 使用 systemd 管理 ElasticSearch,Kibana, 配置如下:
- /etc/systemd/system/elasticsearch.service
- [Service]
- Environment=ES_HOME=/opt/elasticsearch-6.0.0
- Environment=ES_PATH_CONF=/opt/elasticsearch-6.0.0/config
- Environment=PID_DIR=/var/run/elasticsearch
- WorkingDirectory=/opt/elasticsearch-6.0.0
- User=noone
- Group=nonone
- ExecStart=/opt/elasticsearch-6.0.0/bin/elasticsearch -p ${PID_DIR}/elasticsearch.pid --quiet
- # StandardOutput is configured to redirect to journalctl since
- # some error messages may be logged in standard output before
- # elasticsearch logging system is initialized. Elasticsearch
- # stores its logs in /var/log/elasticsearch and does not use
- # journalctl by default. If you also want to enable journalctl
- # logging, you can simply remove the "quiet" option from ExecStart.
- StandardOutput=journal
- StandardError=inherit
- # Specifies the maximum file descriptor number that can be opened by this process
- LimitNOFILE=65536
- # Specifies the maximum number of processes
- LimitNPROC=4096
- # Specifies the maximum size of virtual memory
- LimitAS=infinity
- # Specifies the maximum file size
- LimitFSIZE=infinity
- # Disable timeout logic and wait until process is stopped
- TimeoutStopSec=0
- # SIGTERM signal is used to stop the Java process
- KillSignal=SIGTERM
- # Send the signal only to the JVM rather than its control group
- KillMode=process
- # Java process is never killed
- SendSIGKILL=no
- # When a JVM receives a SIGTERM signal it exits with code 143
- SuccessExitStatus=143
- [Install]
- WantedBy=multi-user.target
复制代码
- /etc/systemd/system/kibana.service
- [Unit]
- Description=Kibana
- [Service]
- Type=simple
- User=noone
- Environment=CONFIG_PATH=/opt/kibana-6.0.1-linux-x86_64/config/kibana.yml
- Environment=NODE_ENV=dev
- ExecStart=/opt/kibana-6.0.1-linux-x86_64/bin/kibana
- [Install]
- WantedBy=multi-user.target
复制代码
创建一个 SpringBoot 应用, 需要在 pom.xml 中引入依赖
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.1</version>
</dependency>
复制代码
然后配置日志, logback-spring.xml
<configuration scan="true">
<include resource="org/springframework/boot/logging/logback/base.xml" />
<appender name="STASH" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/opt/logs/logback/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/opt/logs/logback/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>15</maxHistory>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="STASH" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
复制代码
需要注意日志的名字以及路径, 这个后续要和 Logstash 的配置匹配. 这样做, 主要是将日志按照格式输出到指定的文件中, 方便 Logstash 监控日志文件, 实时获取日志数据.
接下来配置 Logstash,
- /opt/logstash-6.0.1/config/logstash.conf
- input {
- file {
- path => "/opt/logs/logback/*.log"
- codec => "json"
- type => "logback"
- }
- }
- output {
- if [type]=="logback" {
- elasticsearch {
- hosts => [ "localhost:9200" ]
- index => "logback-%{ YYYY.MM.dd}"
- }
- }
- }
复制代码
4.2 使用
启动 ElasticSearch 和 Kibana
- sudo systemctl start elasticsearch.service
- sudo systemctl start kibana.service
复制代码
启动 SpringBoot 应用, 然后启动 Logstash
sudo bin/logstash -f config/logstash.conf
复制代码
打开 Kibana, 稍作配置, 就可以查询应用的日志了.
5 小结
本文主要介绍了基于 ELK 的日志平台搭建, 这只是一个最基础的架构, 当然, 它也不仅仅是适用于基于 SpringCloud 的微服务架构. 随着系统业务量的提升, 可以在此基础上继续演进, 适配更多的业务架构, 处理海量的日志, 并且根据业务需求从日志数据中提取更多的信息.
来源: https://juejin.im/post/5b778425f265da43401573d7