程序笔记   发布时间:2022-07-13  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了SpringCloud Alibaba微服务运维二 - 集成ELK日志大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

大家好࿰c;我是飘渺。这是SpringCloud alibaba开发实战系列文的第三十八篇࿰c;运维系列的第二篇࿰c;系列文章࿰c;欢迎持续关注。 文章会在流量变低时转入收费专栏࿰c;且看且珍惜!

概述

在单体服务中我们需要查看日志只需直接在日志文件中 grep、awk 就可以获得自己想要的信息。

但是在微服务架构中࿰c;不同的服务模块一般会部署多个节点࿰c;日志散落在多个节点的日志文件中。一旦出现问题࿰c;我们就需要登录不同的服务节点分别查看日志c;非常之繁琐。所以在微服务架构中࿰c;我们是需要建立集中式日志收集系统࿰c;将所有节点上的日志统一收集࿰c;管理࿰c;访问。

现在目前主流的分布式日志解决方案还是基于ELK(ElasticSearch、Logstash、Kibana)࿰c;今天我们就动手搭建一个单机版的ELK日志收集系统并将我们的日志文件集成进去。

ELK版本:7.13.4

ElasticSearch 安装配置

说明:ElasticSearch7.13.4内置了JDK16࿰c;如果没有特殊要求࿰c;直接使用默认JDK即可。本文中直接使用ElasticSearch的默认JDK16。

@H_489_27@
  • 下载
  • 下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.4-linux-x86_64.tar.gz

    @H_489_27@
  • 上传文件并解压缩
  • 将下载下来的ElasticSearch上传至服务器目录/app/elasticsearch࿰c;并将其解压

     cd /app/elasticsearch
     tar -zxvf elasticsearch-7.13.4-linux-x86_64.tar.gz
    

    解压完成后的目录结构如下:

    ll
    @R_173_10586@l 319484
    drwxr-xr-x 9 elastic elastic      4096 Jul 15 02:37 elasticsearch-7.13.4
    -rw-r--r-- 1 root    root    327143992 Aug  3 14:26 elasticsearch-7.13.4-linux-x86_64.tar.gz
    
    @H_489_27@
  • 创建ElasticSearch启动用户
  • ElasticSearch不允许使用root用户启动࿰c;所以我们需要创建一个elastic用户用于启动ElasticSearch࿰c;并授予用户对应权限。

    useradd elastic
    chown -R elastic:elastic /app/elasticsearch/
    
    @H_489_27@
  • 修改es配置
  • 配置文件为:/app/elasticsearch/elasticsearch-7.13.4/config/elasticsearch.yml

    关键配置:

    cluster.name: elk-application
    node.name: node-1
    network.host: 0.0.0.0
    http.port: 9200
    discovery.seed_hosts: ["127.0.0.1"]
    cluster.initial_master_nodes: ["node-1"]
    
    @H_489_27@
  • 修改es的JVM参数
  • 配置文件为:/app/elasticsearch/elasticsearch-7.13.4/config/jvm.options

    配置内容:

    -Xms4g
    -Xmx4g
    
    @H_489_27@
  • 修改系统配置文件
    1. /etc/sysctl.conf中增加如下配置
    vm.max_map_count = 655360
    
    1. /etc/security/limits.conf后面增加如下配置
    *    	soft    memlock   unlimited
    *     hard    memlock   unlimited
    *     hard    nofile    65536
    *     soft    nofile    65536
    

    修改完成后需要使用命令 sysctl -p 重新加载配置。

    @H_489_27@
  • 切换elastic用户并启动ElasticSearch
  • su - elastic
    cd /app/elasticsearch/elasticsearch-7.13.4/bin
    ./elasticsearch  # 正常启动࿰c;可以看到启动日志
    或者 ./elasticsearch -d # 后台启动࿰c;看不到启动日志
    
    @H_489_27@
  • 验证安装
  • 在服务器执行curl 127.0.0.1:9200命令࿰c;查看输出结果࿰c;如果输出如下json数据࿰c;则表示启动成功。

    {
      "name" : "node-1",
      "cluster_name" : "elk-application",
      "cluster_uuid" : "qvggIOwbTk6pVlxFlulqQg",
      "version" : {
        "number" : "7.13.4",
        "build_flavor" : "default",
        "build_type" : "tar",
        "build_hash" : "c5f60e894ca0c61cdbae4f5a686d9f08bcefc942",
        "build_date" : "2021-07-14T18:33:36.673943207Z",
        "build_snapshot" : false,
        "lucene_version" : "8.8.2",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }
    

    如果你服务器已经安装好了JDK环境并且想使用自己的JDK࿰c;可以修改配置/app/elasticsearch/elasticsearch-7.13.4/bin中的elasticsearch-env

    在配置ES_CLASSPATH="$ES_HOME/lib/*"之后加入

    ES_JAVA_HOME=/app/elasticsearch/elasticsearch-7.13.4/jdk # 修改为你自己的jdk地址

    Kibana 安装配置

    @H_489_27@
  • 下载
  • 下载地址:https://artifacts.elastic.co/downloads/kibana/kibana-7.13.4-linux-x86_64.tar.gz

    @H_489_27@
  • 上传文件并解压缩
  • 将下载下来的Kibana上传至服务器目录/app/Kibana࿰c;并将其解压

    cd /app/kibana
    tar -zxvf kibana-7.13.4-linux-x86_64.tar.gz
    
    @H_489_27@
  • 修改配置文件/kibana/kibana-7.13.4-linux-x86_64/config/kibana.yml
  • # 端口
    server.port: 5601
    # 指定本机ip让外部能访问
    server.host: "0.0.0.0"
    # 请求数据指向的elasticsearch服务器
    elasticsearch.hosts: ["http://ip:9200"]
    # 中文汉化
    i18n.locale: "zh-CN" 
    

    这几个配置在配置文件中被注释掉了࿰c;直接放开注释做相应的修改即可。

    @H_489_27@
  • 创建kibana启动用户
  • Kibana默认情况下也不允许使用root用户启动࿰c;你可以选择在启动命令后加上--allow-root参数࿰c;不过为了规范࿰c;我们还是创建一个独立用户用于启动Kibana࿰c;并授予用户对应权限。

    useradd kibana
    chown -R kibana:elastic /app/kibana/
    
    @H_489_27@
  • 切换用户并使用启动kibana
  • su - kibana # 切换用户
    ./kibana
    或者 ./kibana &
    或者 ./kibana --allow-root # 未设置独立用户࿰c;不建议使用
    
    @H_489_27@
  • 访问
  • 通过浏览器输入http://ip:5601/即可访问kibana

    SpringCloud Alibaba微服务运维二 - 集成ELK日志

    安全加固

    我们刚刚部署的Kibana是不需要密码就可以登录的࿰c;这样谁都可以kibana访问并且更改索引数据࿰c;在生产环境中为了保证数据的安全࿰c;我们必须得给kibana加上密码࿰c;保证用户登录后可进行操作。

    主要是利用elasticsearch自带的xpack作为权限验证功能。操作步骤如下:

    1. 修改ES配置开启 X-PACK

    修改ElasticSearch的配置文件࿰c;/app/elasticsearch/elasticsearch-7.13.4/config/elasticsearch.ymlc;开启x-pack

    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    

    2. 重启ElasticSearch

    ./bin/elasticsearch -d

    3. 初始化用户密码

    cd /app/elasticsearch/elasticsearch-7.13.4/bin
    ./elasticsearch-setup-passwords interactive
    

    执行后会出现下面的内容࿰c;让你设置对应的密码࿰c;输入 y 继续

    InitiaTing the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
    you will be prompted to enter passwords as the process progresses.
    Please confirm that you would like to conTinue [y/N]y
    
    ...
    Changed password for user [apm_system]
    Changed password for user [kibana_system]
    Changed password for user [kibana]
    Changed password for user [logstash_system]
    Changed password for user [beats_system]
    Changed password for user [remote_monitoring_user]
    Changed password for user [elastic]
    

    4. 设置证书

    用X-pack后ElasticSearch的启动日志会报Caused by: javax.net.ssl.SSLHandshakeException: No available authentication scheR_326_11845@e的异常࿰c;原因是因为缺少CA证书࿰c;所以我们需要给其生成一个。

    ./bin/elasticsearch-certutil ca
    

    看到提示后直接回车即可࿰c;不用设置密码

    If you elect to generate PEM format certificates (the -pem option), then the output will
    be a zip file containing individual files for the CA certificate and private key
    
    Please enter the desired output file [elastic-stack-ca.p12]:  # 直接回车
    Enter password for elastic-stack-ca.p12 : # 直接回车
    
    

    之后我们在ElasticSearch的安装目录下会看到这个证书文件elastic-stack-ca.p12

    SpringCloud Alibaba微服务运维二 - 集成ELK日志

    现在我们借助生成的这个证书文件生成p12秘钥

    ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
    

    看到提示后还是直接回车࿰c;不设置密码

    Enter password for CA (elastic-stack-ca.p12) :  # 直接回车
    Please enter the desired output file [elastic-certificates.p12]: # 回车
    Enter password for elastic-certificates.p12 : # 回车
    
    # 文件路径
    Certificates written to /app/elasticserach/elasticsearch-7.13.4/elastic-certificates.p12
    
    

    此时文件如下:

    SpringCloud Alibaba微服务运维二 - 集成ELK日志

    在config目录下创建certs目录࿰c;并将生成的秘钥文件拷贝进去

    @H_522_43@mkdir certs
    cp ../elastic-certificates.p12 certs/elastic-certificates.p12
    

    再次修改ElasticSearch的配置文件elasticsearch.yml中xpack相关配置

    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
    

    接着再次重启ElasticSearch后错误消失。

    5. 修改Kibana配置

    修改kibana配置文件/app/kibana/kibana-7.13.4-linux-x86_64/config/kibana.yml

    elasticsearch.username: "elastic" 
    elasticsearch.password: "changeMe"
    

    5. 重新启动kibana

    6. 验证

    使用curl访问ElasticSearch提示需要密码

    {
      "error": {
        "root_cause": [
          {
            "type": "security_exception",
            "reason": "missing authentication credentials for REST request [/]",
            "header": {
              "WWW-Authenticate": "basic realm="security" charset="UTF-8""
            }
          }
        ],
        "type": "security_exception",
        "reason": "missing authentication credentials for REST request [/]",
        "header": {
          "WWW-Authenticate": "basic realm="security" charset="UTF-8""
        }
      },
      "status": 401
    }
    

    带上密码后重新调用࿰c;显示正常

    curl --user elastic:password http://ip:9200/

    {
      "name" : "node-1",
      "cluster_name" : "efk-application",
      "cluster_uuid" : "qvggIOwbTk6pVlxFlulqQg",
      "version" : {
        "number" : "7.13.4",
        "build_flavor" : "default",
        "build_type" : "tar",
        "build_hash" : "c5f60e894ca0c61cdbae4f5a686d9f08bcefc942",
        "build_date" : "2021-07-14T18:33:36.673943207Z",
        "build_snapshot" : false,
        "lucene_version" : "8.8.2",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }
    

    重新登录kibana需要使用密码࿰c;需要使用elastic账户登录

    SpringCloud Alibaba微服务运维二 - 集成ELK日志

    登录后在kibana中可以对用户和角色进行管理。

    SpringCloud Alibaba微服务运维二 - 集成ELK日志

    Logstash安装配置

    @H_489_27@
  • 下载
  • 下载地址:https://artifacts.elastic.co/downloads/logstash/logstash-7.13.4-linux-x86_64.tar.gz

    @H_489_27@
  • 上传文件并解压缩
  • 将下载下来的logstash上传至服务器目录/app/logstashc;并将其解压

     cd /app/logstash
     tar -zxvf logstash-7.13.4-linux-x86_64.tar.gz
    
    @H_489_27@
  • 修改配置文件
  • /app/logstash/logstash-7.13.4/config中复制logstash-sample.conflogstash.confc;并修改里面的内容:

    cp logstash-sample.conf logstash.conf
    
    input {
      beats {
        port => 5044
      }
    }
    
    output {
      elasticsearch {
        hosts => ["http://ip:9200"]
        index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.Mm.dD}"
        user => "elastic"
        password => "password"
      }
    }
    

    主要修改host、user、password的属性值。

    @H_489_27@
  • 启动logstash
  • ./logstash -f ../config/logstash.conf 
    

    通过上面的安装配置我们已经将ELK环境搭建完毕࿰c;接下来需要将日志集成进来。

    集成日志

    日志接入到ELK有多种形式࿰c;最常见的就是使用FileBeat。此时Filebeat扮演日志代理的角色࿰c;安装在生成日志文件的计算机上࿰c;跟踪它们࿰c;并将数据转发到Logstash以进行更高级的处理࿰c;或者直接转发到Elasticsearch进行索引。

    SpringCloud Alibaba微服务运维二 - 集成ELK日志

    这种方式实现比较简单࿰c;在我 “运维监控” 系列文章中有详细介绍࿰c;感兴趣的同学可以移步查看。

    ELK实战二 - 日志集成

    今天我们介绍另外一种方式࿰c;使用logstash-logBACk-encoder直接将logBACk日志推送到logstash。

    配置 logstash 输出到 elasticsearch

    操作步骤如下:

    1. 引入logstash插件包
    <dependency>
      <groupId>net.logstash.logBACk</groupId>
      <artifactId>logstash-logBACk-encoder</artifactId>
      <version>6.6</version>
    </dependency>
    
    1. 修改logBACk-spring.xml࿰c;配置logstash到appender
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false">
    	<!--定义日志文件的存储地址 -->
    	<property name="LOG_HOME" value="./logs" />
    	<property name="LOG_NAME" value="cloud_gateway" />
    
    	<springProperty scope="context" name="applicationName" source="spring.application.name"/>
    	...
    	<!--LogStash-->
    	<appender name="logstash" class="net.logstash.logBACk.appender.LogstashTcpSocketAppender">
        <!--logstash的请求地址-->
    		<desTination>172.xx.0.xxx:5064</desTination>
    		<encoder charset="UTF-8" class="net.logstash.logBACk.encoder.LogstashEncoder">
    			<customFields>{"serverName":"${applicationNamE}"}</customFields>
    		</encoder>
    	</appender>
    
    
    	<!-- 日志输出级别 -->
    	<root level="INFO">
    		...
    		<appender-ref ref="logstash"/>
    	</root>
    
    </configuration>
    

    文件中删除了不相关的配置࿰c;值得注意的是这里定义了一个静态常量appllicationNamec;从配置文件中读取spring.application.name的值࿰c;并通过customFields自定义字段serverName传输到了logstash。

    1. 修改logstash的配置文件࿰c;logstash.conf
    input {
      tcp {
        port => 5064
        codec => json_lines
        type => "cloud_alibaba"
      }
    }
    
    output {
      # 如果不需要打印可以直接删除
      stdout{
        codec => rubydebug
      }
    
      # 通过type用于区分不同来源的日志
      if [type] == "cloud_alibaba"{
        elasticsearch {
          hosts => ["http://localhost:9200"]
          index => "%{[serverName]}-%{+YYYY.Mm.dD}"
          user => "elastic"
          password => "changeMe"
        }
      }
    }
    

    logstash需要使用tcp协议接受logstash传来的日志࿰c;并使用customFields中定义的serverName动态建立索引

    1. 重新启动logstash 以及后端服务

    SpringCloud Alibaba微服务运维二 - 集成ELK日志

    通过logstash的启动面板可以看到日志已经传输到了ElasticSearch࿰c;并且已经使用cloud-gateway作为索引名。

    kibana操作

    日志传输到ElasticSearch后我们就需要借助kibana将日志展示出来。

    首先我们需要登录kibana࿰c;创建索引模式

    @H_370_1555@

    使用cloud-gateway-*作为索引名称࿰c;然后点下一步并保存。

    然后就可以在Discover中查看日志了。

    SpringCloud Alibaba微服务运维二 - 集成ELK日志

    可以通过左侧添加对应的字段。

    当然也可以流式传输实时查看日志

    SpringCloud Alibaba微服务运维二 - 集成ELK日志

    至于kibana的其他功能就需要各位自己去摸索了。

    logBACk动态读取logstash的路径

    上面我们配置logstash输出到elasticsearch的时候是直接写死了desTination的配置

    <desTination>172.xx.0.xxx:5064</desTination>
    

    那在实际开发的时候我们肯定不能这样࿰c;环境不同logstash的路径也不同࿰c;所以我们需要从nacos配置中心读取对应logstash的地址。

    小提示࿰c;springboot读取配置文件是有优先级的࿰c;如果使用默认的logBACk.xml或者logBACk-spring.xml为配置文件名则会读取不到nacos上的配置࿰c;他会先于配置中心加载。所以我们这里需要使用自定义配置文件

    1. 修改nacos配置中心service对应的配置文件࿰c;配置自定义日志名称以及logstash的路径
    logging:
      config: classpath:logBACk-custom.xml
      
    logstash:
      desTination: 172.xx.0.xxx:5064
    
    1. 修改日志配置文件为 logBACk-custom.xml

    2. 在logBACk-custom.xml中定义常量࿰c;从配置中心读取配置࿰c;并修改desTination属性的值

    <springProperty scope="context" name="logstashDesTination" source="logstash.desTination"/>
    ...
    <desTination>${logstashDesTination}</desTination>
    

    通过上面三步操作࿰c;我们的logBACk就可以直接从nacos配置文件中加载logstash的相关配置了。

    小结

    ELK集中式日志是分布式架构中必不可少的一个组件࿰c;本文详细介绍了ELK基础环境的安装配置࿰c;希望对各位有所帮助。最后࿰c;我是飘渺Jam࿰c;一名写代码的架构师࿰c;做架构的程序员࿰c;期待您的转发与关注。

    大佬总结

    以上是大佬教程为你收集整理的SpringCloud Alibaba微服务运维二 - 集成ELK日志全部内容,希望文章能够帮你解决SpringCloud Alibaba微服务运维二 - 集成ELK日志所遇到的程序开发问题。

    如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
    如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。