从零搭建一个ELK日志系统

409 阅读4分钟

为什么要搭建日志系统

线上环境发生故障时,工程师需要连接到生产环境服务器,使用各种日志查询命令 tail、cat、sed 、grep等定位故障问题。而在微服务架构下通常一个服务会部署多个实例,那就需要到每个日志目录下去查找日志文件,每个应用实例通常会设置日志滚动策略(按照日期每天一个日志文件)。此类繁琐的工作大大降低了排查问题的效率。于是乎,要解决这个问题,就需要有一套智能化的日志系统,它能够将这些日志管理起来并提供检索功能,帮助工程师及时排查故障,解决这些痛点。因此诞生了ELK日志系统。

什么是ELK

ELK是elastic公司提供的一套从日志收集--存储--展示的完整解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana。

ElasticSearch

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。它是一个建立在全文搜索引擎Apache Lucene基础上搜索引擎,使用Java语言编写。并且作为elk的核心,集中存储数据。

Logstash

Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到指定的“存储库”中。

Kibana

通过 Kibana,可以对 Elasticsearch 进行可视化,还可以在 Elastic Stack 中进行导航,这样便可以进行各种操作,从跟踪查询负载,到理解请求如何流经整个应用,都能轻松完成。

下载地址

www.elastic.co/cn/download…

注意:ElasticSearch,Kibana,Logstash,ik版本必须一致

ElasticSearch

安装ElasticSearch

  • 解压完成删除安装文件 rm -rf elasticsearch-7.15.2-linux-x86_64.tar.gz

启动ElasticSearch

  • 进入ElasticSearch安装目录config文件夹 cd elasticsearch-7.15.2/config

  • 编辑配置文件vim elasticsearch.yml更改如下信息: 

    path.data: /opt/elasticsearch-7.5.1/data  #data存放路径
    path.logs: /opt/elasticsearch-7.5.1/logs  #日志存放路径
    network.host: 0.0.0.0 #监听网络地址
    http.port: 9200 #端口
    http.cors.enabled: true #跨域
    http.cors.allow-origin: "*"

  • root用户不能直接启动elasticseach,需要新建一个用户,用新建立的用户去启动es linux创建新用户 adduser elk
    给新建用户elk设置密码 passwd elk 密码(需要输入2次)
    给新建用户elk对应权限 chown -R elk /root/elk/elasticsearch-7.15.2
    切换到新建用户下,执行启动命令

  • 启动es 进入bin目录,es启动命令: ./elasticsearch -d (-d表示后台启动)

  • 启动不成功: 在/etc/sysctl.conf文件最后一行添加 vm.max_map_count=262144 刷新配置,立即生效 sysctl -p

访问ElasitcSearch

浏览器输入http://ip:9200

看到ElasitcSearch信息安装成功

安装ik中文分词器

下载地址:github.com/medcl/elast…

根据es版本选择,下载后解压

将文件复制到es安装目录下/plugin/ik下即可

重启es

Kibana

安装Kibana

  • 解压完成删除安装文件 rm -rf kibana-7.15.2-linux-x86_64.tar.gz

启动Kibana

  • 进去kibana配置文件夹 cd kibana-7.5.1/config/
  • 编辑kibana.yml配置文件 vim kibana.yml 输入如下信息 server.port: 5601 #端口
    server.host: "0.0.0.0" #允许所有外部访问
    server.name: "elk" #服务名称
    elasticsearch.hosts: ["http://ip:9200"] #所有查询所使用的es实例
    i18n.locale: "zh-CN" #界面语言显示为中文
  • cd 进入bin目录,启动命令: sh kibana &
  • 后台启动: nohup ./bin/kibana &

访问Kibana

在浏览器输入 http://ip:5601

看到kibana界面安装成功

Logstash

安装Logstash

  • 解压完成删除安装文件 rm -rf logstash-7.15.2.tar.gz

启动Logstash

  • 进入logstash配置文件目录 cd logstash-7.5.1/config/
  • 编辑logstash.yml配置文件 vim logstash.yml
  • 进入bin 目录,新建文件 vim sql.conf 输入如下
    • input: 数据来源 
input {
     file {
         path => "/home/denghua/mysql/elk.log"
         type => "elk"
         start_position => beginning
     }
 }
 filter {
 
 }
 output {
     elasticsearch {
     hosts => "localhost:9200"
     index => "es-message-%{+YYYY.MM.dd}"
     }
     stdout{codec => rubydebug}
 }
      • log(读取日志)
        • path:来源日志文件路径
        • type:日志分类
        • start_position: 数据读取点,一般从开始读取
 # Sample Logstash configuration for creating a simple
 # oracle -> Logstash -> Elasticsearch pipeline.
 
 input {
    jdbc {
     jdbc_connection_string => "jdbc:oracle:thin:@ip:1521/helowin"
     jdbc_user => "user"
     jdbc_password => "userpwd"
     jdbc_driver_library => "/root/elk/ojdbc14-10.2.0.4.0.jar"
     jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
         
     statement => "select * from SYS_OPER_LOG WHERE oper_id > :sql_last_value"
  
     schedule => "* * * * *"
 
     use_column_value => true
 
     tracking_column => "oper_id"
 
     last_run_metadata_path => "/root/elk/logstash-7.15.2/last_run_metadata.txt"
    }
 }
 filter {
     json {
         source => "message"
     remove_field => ["message"]
     }
 }
 
 output {
   elasticsearch{
     
     hosts => "127.0.0.1:9200"
     
     index => "log"
     
     document_id => "%{oper_id}"
    }
    stdout {
      codec => json_lines
    } 
 }
      • jdbc(抽取数据库数据)需要先安装

logstash-integration-jdbc

进入bin目录

./logstash-plugin install logstash-integration-jdbc
        • jdbc_connection_string: 数据库连接字符串
        • jdbc_user: 用户名
        • jdbc_password: 密码
        • jdbc_driver_library: Jdbc驱动程序库
        • jdbc_driver_class:JDBC驱动程序类
        • schedule: 定时抽取(cron表达式)
        • use_column_value: 是否需要记录某个column 的值,如果 record_last_run 为真,可以自定义我们需要表的字段名称
        • tracking_column: 如果 use_column_value 为真,需配置此参数. 这个参数就是数据库给出的一个字段名称。当然该字段必须是递增的,可以是 数据库的数据时间这类的
        • last_run_metadata_path: 上次执行到的 tracking_column 字段的值的保存地址
    • out: 数据流向,数据输送到elasticsearch
      • hosts:es地址
      • index:目标索引
      • stdout:标准输入
  • 启动logstash,启动命令 sh logstash -f logstashyezi.config &
  • 后台启动: nohup ./bin/logstash -f ./config/mysql.conf &
  • 在浏览器输入 [http://ip:9600] 看到logstash信息启动成功