因线上用户量与日俱增, 日志运维工作愈加困难, 日志量以及分布式架构带来的碎片化, 需要使用一种统一管理的方式

下面是我在实际运用中总结的安装调试步骤, 此时此刻 ELK 版本为: v 7.15.1
以下的步骤其实可以简化 input 的链路, 可以直接使用 logstash 的 log4j 组件来作为 input, 但是改造需要动服务, 就作罢了, 而且也会造成服务与服务之间的耦合性

各个服务提供的能力, 在本文就不叙述了, 百度一下到处都有, 阅读本篇文章的前提是至少你了解 ELK 技术栈

elasticsearch

  1. 下载 jdk11+ 并配置 ES_JAVA_HOME
  2. 下载 ES https://www.elastic.co/cn/downloads/elasticsearch 找到 linux 64版本的 使用 curl -O 下载
  3. 创建用户 gomyck 并把 es 所在目录 chown 到 gomyck 上 chown -Rh gomyck:root dir
  4. 在 /etc/sysctl.conf 追加最大虚拟空间限制 vm.max_map_count=655360, 记得 sysctl -p 使系统配置生效
  5. 修改elasticsearch.yml 开启密码验证 允许非本机 IP 访问
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    network.host: 0.0.0.0
    discovery.seed_hosts: ["0.0.0.0"]
    
  6. 启动 es
    # 可执行文件在 bin 文件夹下  -d 为 后台运行
    $ ./elasticsearch -d
    
  7. 添加一个用户
    # 可执行文件在 bin 文件夹下
    $ ./elasticsearch-users add gomyck
    
  8. 为用户添加超级管理员权限, 否则 kibana 不能获取 es 版本信息, 导致启动报错
    # 可执行文件在 bin 文件夹下
    $ ./elasticsearch-users roles gomyck -a superuser 
    

kibana

  1. 下载 kibana https://www.elastic.co/cn/downloads/kibana 找到 linux 64版本的 使用 curl -O 下载
  2. 编辑 kibana.yml
    xpack.encryptedSavedObjects.encryptionKey: 84FF5616002D30323B2ACDB3C8C0CAC2
    server.host: "0.0.0.0"
    elasticsearch.hosts: ["http://localhost:9200"]
    elasticsearch.username: "gomyck"
    elasticsearch.password: "xxxxxx"
    elasticsearch.requestHeadersWhitelist: [ authorization ]
    
  3. 启动 kibana
    # 可执行文件在 bin 文件夹下
    $ nohup ./kibana serve >ck.log 2>&1 &
    

logstash

一开始并没有考虑使用 logstash 作为 es 的 input, 因为 logstash 作为 java 应用程序, 并且功能庞大, 还是比 golang 写的 filebeat 吃系统资源, 后来也是因为它功能强大才不得不使用他, 哈哈
不过最新版的 filebeat 已经支持 grok 了, 其实可以不用 logstash, 因为链路长还涉及到时钟同步问题, 在后面的配置中会带解决办法
  1. 下载 logstash https://www.elastic.co/cn/downloads/logstash
  2. 编辑 logstash.yml
    ------------ HTTP API Settings -------------
    http.host: 0.0.0.0
    mv logstash.conf.simple logstash.conf vim logstash.conf
    input {
     beats {
         port => 5044
     }
    }
    filter {
     grok {
         match => {
             "message" = > "(?<logTime>(%{YEAR}[./-]%{MONTHNUM}[./-]%{MONTHDAY})\s+%{TIME}) (?<thread>\[.*\]) %{LOGLEVEL:logLevel}.*-%{JAVACLASS:className} (?<logInfo>.*)"
         }
     }
     date {
         match => ["logTime", "ISO8601"]
         target => "@timestamp"
     }
    }
    output {
     elasticsearch {
         hosts => ["http://localhost:9200"]
         index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
         user => "gomyck"
         password => "*****"
     }
    }
    
最恶心的地方就是 grok 的正则编写, 因为 grok 的现有模版都不满足我的日志格式, 所以必须还要学习一下 grok 的 DSL, 其实跟正则差不多, 可以理解为正则的扩展, 因为它可以把正则匹配到的值赋到变量名上
关于时钟不同步问题, 因为 filebeat 的 input 和 output 并不是单线程顺序执行, logstash 也是如此, 所以存在 后生产 的日志先被上送到 es, 这其中, 可能在 logstash 阶段就已经串版了, 也可能在 es 上送阶段串版
为了解决这个问题, 可以在拦截器中定义一个 date 组件, 使用服务日志的时间作为 es 的标准保留字@timestamp(ES 根据此字段来排序消息, 可以在 logs 控制台验证)
  1. 启动 logstash
    # 自动应用已修改的配置
    $ ./logstash -f ../conf/logstash.conf --config.reload.automatic
    

filebeat

  1. 在日志采集机器上安装 filebeat (注意 filebeat 的版本号要和 kibana 一致)
    $ curl -L -O xxxx.rpm
    $ sudo rpm -vi xxxx.rpm
    
  2. 修改 /etc/filebeat/filebeat.yml 以设置连接信息(注意编辑 input 和 output 就可以了, 这个比较好配置)
  3. 开启 logstash 模块
    $ sudo filebeat modules enable logstash
    
  4. 启动 filebeat
    $ sudo service filebeat start
    

一些其他的说明

  1. grok 的调试工具 http://kibanaIp:5601/app/dev_tools#/grokdebugger

  2. es 索引管理在 management -> stack management 下, 可以配置一些滚动策略防止日志日积月累过大导致的服务器存储空间不足问题


相关文章:
⤧  上一篇 Spring Cache 底层代码剖析 ⤧  下一篇 删除 mac 默认输入法