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

Posted Lemo_wd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 内消费数据,达到分层目的。

 

技术图片

 

 

基础实践

简化架构图

 

技术图片

 

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:

技术图片

 

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

技术图片

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

技术图片

 

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

技术图片

 

 

 

使用 redis 部署分布式 ELK 环境

技术图片

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 中看到对应的输出。

 

 

 

 

以上是关于ELK(R) 实现分布式 Nginx 日志的主要内容,如果未能解决你的问题,请参考以下文章

ELK日志服务器的快速搭建并收集nginx日志

ELK安装配置及nginx日志分析

ELK整合Filebeat监控nginx日志

ELK+kafka收集 Nginx与tomcat日志

资深架构师教你如何使用elk+redis搭建nginx日志分析平台!

centos6.5下安装配置ELK及收集nginx日志