ELK日志收集

目前,各个微服务系统的日志都保存在各自指定的目录中,如果这些微服务部署在不同的服务器上,那么日志文件也是分散在各自的服务器上。分散的日志不利于我们快速通过日志定位问题,我们可以借助ELK来收集各个微服务系统的日志并集中展示。

ELK即Elasticsearch、Logstash和Kibana首字母缩写。Elasticsearch用于存储日志信息,Logstash用于收集日志,Kibana用于图形化展示。

搭建ELK环境

在Windwos上搭建ELK环境较为麻烦,这里我选择在CentOS7 上通过Docker来搭建ELK环境,对Docker基本使用不熟悉的同学可以参考 Docker基础教程

在此之前,我们需要准备一台CentOS 7虚拟机。推荐大家使用Vagrant来创建,创建教程可以参考:使用Vagrant创建CentOS虚拟机。这里分享下我的Vagrantfile配置:

Lua 复制代码
 Vagrant.configure("2") do |config|
   config.vm.box = "centos7"
   config.vm.network "private_network", ip: "192.168.33.10"
   config.vm.hostname = "febs"
   config.vm.provider "virtualbox" do |v|
     v.memory = 6144
     v.cpus = 2
   end
 end

上面配置了虚拟机的IP地址为192.168.33.10,hostname为febs,内存为6*1024MB(6144MB即6GB),cpu核心数为2。

安装docker

在CMD终端使用命令vagrant ssh连接虚拟机后,运行sudo -s切换到root用户,下面的示例都是用root用户完成的。

在Linux中安装Docker可以参考官方文档:CentOS | Docker Docs,主要分为下面这几步:

  1. 卸载旧版本Docker(如果系统之前没安装过Docker,可以跳过):
Lua 复制代码
 yum remove docker \
                   docker-client \
                   docker-client-latest \
                   docker-common \
                   docker-latest \
                   docker-latest-logrotate \
                   docker-logrotate \
                   docker-engine
  1. 安装Docker所需要的包:
Lua 复制代码
 yum install -y yum-utils \
   device-mapper-persistent-data \
   lvm2
  1. 设置稳定的仓库:
Lua 复制代码
 yum-config-manager \
     --add-repo \
     https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装最新版的Docker引擎:
Lua 复制代码
 yum install docker-ce docker-ce-cli containerd.io
  1. 启动Docker:
Lua 复制代码
 systemctl start docker

查看是否安装成功:

安装Docker Compose

安装好Docker后,我们接着安装Docker Compose,官方安装教程 Install | Docker Docs,主要步骤为:

  1. 获取Docker Compose的最新稳定版本:
Lua 复制代码
 curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 对二进制文件授予可执行权限:
Lua 复制代码
 chmod +x /usr/local/bin/docker-compose
  1. 创建link:
Lua 复制代码
 ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

查看是否安装成功:

Docker Compose搭建ELK

在搭建ELK之前,我们需要做一些准备工作。

正如官方所说的那样 Virtual memory | Elasticsearch Guide 8.15 | Elastic,Elasticsearch默认使用mmapfs目录来存储索引。操作系统默认的mmap计数太低可能导致内存不足,我们可以使用下面这条命令来增加内存:

Lua 复制代码
 sysctl -w vm.max_map_count=262144

创建Elasticsearch数据挂载路径:

Lua 复制代码
 mkdir -p /febs/elasticsearch/data

对该路径授予777权限:

Lua 复制代码
 chmod 777 /febs/elasticsearch/data

创建Elasticsearch插件挂载路径:

Lua 复制代码
 mkdir -p /febs/elasticsearch/plugins

创建Logstash配置文件存储路径:

Lua 复制代码
 mkdir -p /febs/logstash

在该路径下创建logstash-febs.conf配置文件(没有安装vim的话可以使用yum install vim命令安装):

Lua 复制代码
 vim /febs/logstash/logstash-febs.conf

内容如下所示:

Lua 复制代码
 input {
   tcp {
     mode => "server"
     host => "0.0.0.0"
     port => 4560
     codec => json_lines
   }
 }
 output {
   elasticsearch {
     hosts => "es:9200"
     index => "febs-logstash-%{+YYYY.MM.dd}"
   }
 }

创建ELK Docker Compose文件存储路径:

Lua 复制代码
 mkdir -p /febs/elk

在该目录下创建docker-compose.yml文件:

Lua 复制代码
 vim /febs/elk/docker-compose.yml

内容如下所示:

Lua 复制代码
 version: '3'
 services:
   elasticsearch:
     image: elasticsearch:6.4.1
     container_name: elasticsearch
     environment:
       - "cluster.name=elasticsearch" #集群名称为elasticsearch
       - "discovery.type=single-node" #单节点启动
       - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #jvm内存分配为512MB
     volumes:
       - /febs/elasticsearch/plugins:/usr/share/elasticsearch/plugins
       - /febs/elasticsearch/data:/usr/share/elasticsearch/data
     ports:
       - 9200:9200
   kibana:
     image: kibana:6.4.1
     container_name: kibana
     links:
       - elasticsearch:es #配置elasticsearch域名为es
     depends_on:
       - elasticsearch
     environment:
       - "elasticsearch.hosts=http://es:9200" #因为上面配置了域名,所以这里可以简写为http://es:9200
     ports:
       - 5601:5601
   logstash:
     image: logstash:6.4.1
     container_name: logstash
     volumes:
       - /febs/logstash/logstash-febs.conf:/usr/share/logstash/pipeline/logstash.conf
     depends_on:
       - elasticsearch
     links:
       - elasticsearch:es
     ports:
       - 4560:4560

切换到/febs/elk目录下,使用如下命令启动:

XML 复制代码
 docker-compose up -d

第一次启动的时候,Docker需要拉取ELK镜像,过程可能稍慢,耐心等待即可。成功启动后,观察容器运行情况:

三个容器都已经启动成功。

Logstash中安装json_lines插件

使用如下命令进入到Logstash容器中:

复制代码
 docker exec -it logstash /bin/bash

切换到/bin目录,安装json_lines插件,然后退出:

使用浏览器访问http://192.168.33.10:5601便可以看到Kibana管理界面:

修改微服务日志配置

就目前微服务模块来说,我们比较关注febs-auth、febs-gateway、febs-server-system和febs-server-test模块的日志,所以我们分别在febs-auth、febs-gateway和febs-server模块的pom里引入Logstash依赖:

XML 复制代码
 <dependency>
     <groupId>net.logstash.logback</groupId>
     <artifactId>logstash-logback-encoder</artifactId>
     <version>6.1</version>
 </dependency>

然后在febs-auth、febs-gateway、febs-server-system和febs-server-test模块的日志配置文件logback-spring.xml里添加如下配置:

XML 复制代码
 <!--输出到 logstash的 appender-->
 <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
     <destination>192.168.33.10:4560</destination>
     <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
 </appender>
 ​
 ......
 <root level="info">
     ......
     <appender-ref ref="logstash" />
 </root>

192.168.33.10:4560对应我们刚刚搭建的Logstash地址。

演示

依次启动febs-register、febs-gateway、febs-auth、febs-server-system和febs-server-test模块,然后回到Kibana管理界面创建Kinaba Index Patterns:

在Index pattern里输入我们在logstash配置文件logstash-febs.confoutput.index指定的值febs-logstash-*

点击Next Step,在下拉框里选择@timestamp

最后点击Create Index Pattern按钮完成创建。

使用PostMan获取令牌:

然后发送一笔localhost:8301/test/hello?name=夏天请求:

在Kibana里搜索这笔日志:

日志收集成功。

整合ELK后,我们的系统架构图如下所示:

相关推荐
小张同学a.15 小时前
ELK企业级日志分析平台3——ES数据备份 & 集群监控 & ELFK+Kafka 架构部署
linux·运维·elk·elasticsearch·架构·kafka·filebeat
Aision_2 天前
实习手记 Day:从 ELK 到 Agent 的“最后一公里”——告警消费与上下文富化
运维·人工智能·web安全·elk·网络安全·安全威胁分析
u0103055274 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055275 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝6 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055276 天前
Java图像处理实战指南
人工智能·1024程序员节
u0103055277 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055279 天前
Java实用类应用精讲
人工智能·1024程序员节
u01030552710 天前
Java I/O核心操作实战
人工智能·1024程序员节
u01030552711 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节