ELK(R) 实现分布式 Nginx 日志

ELKR 概述

ELK(R) = Elasticsearch + Logstash + Kibana (+ Redis) 是一套完整的工业级日志分析工具。

 

Elasticsearch 是整个日志分析系统的核心,它负责对日志数据进行分析、索引等重要工作;

 

Logstash 则主要用于对日志数据进行初步的过滤和筛选。例如,Logstash 可以将拥有日志数据的从节点(Slave Node)服务器内的日志数据发送到 Elasticsearch 的主服务器。

 

Kibana 则是为了让 Elasticsearch 更好的与用户进行交互而设计的一个 Web 前端工具,具备强大的数据可视化功能。

 

Redis 本身并不属于 ELK 技术栈里的一份子,而是作为一个插件存在于 ELK 技术栈中。Redis 提供了一个很好的缓冲区,它能够很好的帮助我们在主节点上屏蔽掉多个从节点之间不同日志文件的差异,负责管理日志端(从节点)的人可以专注于向 Redis 里生产数据,而负责数据分析聚合端的人则可以专注于从 Redis 内消费数据,达到分层目的。

 

image.png

 

 

基础实践

简化架构图

 

image.png

 

logstash 基础配置

 

/etc/logstash/conf.d/logstash-shipper.conf

input {
  stdin {}
  file {
    path => "/etc/nginx/logs/access.log"
    start_position => "beginning"
    codec =>  multiline {
      negate => true
      pattern => '^\d'
      what => 'previous'
    }
  }
}
output {
    stdout {
        codec => rubydebug
    }
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "logstash-%{+YYYY.MM.dd}"
    }
}

 

检测文件语法并报告错误

logstash -f conf.d/logstash-shipper.conf --path.settings=/etc/logstash --config.test_and_exit 

 

kibana 简单使用

 

Step 1 创建一个索引在 Index pattern 中填写 logstash-*,然后点击 Next step:

image.png

 

Step 2 配置一个索引模式,这里可以直接使用默认索引模式 @timestamp

image.png

Step 3 可以看到 kibana 默认为我们创建了 16 个字段(fields)

image.png

 

Step 4 点击左侧边栏的 Discover ,进入到 Kibana 的全局搜索界面,刷新下日志查看统计数据

image.png

 

 

 

使用 redis 部署分布式 ELK 环境

image.png

Redis 本身并不属于 ELK 技术栈里的一份子,而是作为一个插件存在于 ELK 技术栈中。Redis 提供了一个很好的缓冲区,它能够很好地帮助我们在主节点上屏蔽掉多个从节点之间不同日志文件的差异,从而使用 Redis 对数据的产生和使用进行了分层。

 

由于环境不好实现集群效果,我们可以通过开启多个 Logstash 进程来模拟 Slave Node。

 

配置 logstash

 

模拟 Master Node 的 Logstash 配置,进程角色为 Indexer

 

从 redis 中读取数据

 

/etc/logstash/conf.d/logstash-indexer.conf

input {
    redis {
      host => "localhost"
      data_type => "list"
      key => "logstash"
    }
}
output {
    stdout {
        codec => rubydebug
    }
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "logstash-%{+YYYY.MM.dd}"
    }
}

 

模拟 Slave Node 的 Logstash 配置,进程角色为 Shipper

 

设置 output 为 Redis,将日志数据输出到 redis

 

/etc/logstash/conf.d/logstash-shipper.conf

input {
  stdin {}
  file {
    path => "/etc/nginx/logs/access.log"
    type => "systemlog"
    start_position => "beginning"
    codec =>  multiline {
      negate => true
      pattern => '^\d'
      what => 'previous'
    }
  }
}
output {
    if [type] == "systemlog" {
      redis {
          host => "localhost"
          data_type => "list"
          key => "logstash"
      }
    }
}

 

进行测试

执行 shipper

logstash -f conf.d/logstash-shipper.conf --path.settings=/etc/logstash --config.test_and_exit 

执行 indexer

logstash -f conf.d/logstash-indexer.conf --path.settings=/etc/logstash --path.data=/tmp --config.test_and_exit 

 

在同一台主机上启动多个 logstash 进程需要将它们的数据目录分开,这里通过 --path.data 选项给第二个进程分配了一个单独的目录。

 

在 Shipper 中输入数据,然后可以在 Indexer 中看到对应的输出。

 

 

 

 

posted on 2020-06-26 16:59  Lemo_wd  阅读(316)  评论(0编辑  收藏  举报

导航