简介:

ELK-Stack 日志收集系统。最后一次全篇记录的笔记,之后关于 ELK 的笔记都将是片段型、针对性的。
 
环境介绍:

ELK-Stack:192.168.1.25 ( Redis、LogStash、Kibana )
ES-1: 192.168.1.26 ( ElasticSearch )
ES-2: 192.168.1.27 ( ElasticSearch )

Node: *.*.*.* ( LogStash )

工作流程:

1、Node:LogStash 收集日志发往 --> ELK-Stack:Redis
2、ELK-Stack:LogStash 将 Redis 消息队列中的数据取出发往 --> ElasticSearch
3、ELK-Stack:Kibana 去 ElasticSearch 读取数据并展示

# 接下来我们将按 ELK 工作流程来搭建并配置环境

一、Node:LogStash 客户端收集日志

shell > yum -y install java

shell > cd /usr/local/src
shell > wget https://download.elastic.co/logstash/logstash/logstash-2.4.0.tar.gz
shell > tar zxf logstash-2.4..tar.gz
shell > mv logstash-2.4. ../; cd ~ shell > vim /usr/local/logstash-2.4./logstash.conf
# Logstash input {
file {
type => "nginx_access"
path => ["/tmp/access.log"]
start_position => "beginning"
}
} output {
stdout {
codec => rubydebug
}
}

# input 插件定义从哪里读取日志,output 插件定义将日志输出到哪里。

shell > /usr/local/logstash-2.4./bin/logstash -f /usr/local/logstash-2.4./logstash.conf -t  # 测试配置文件正确
Configuration OK shell > /usr/local/logstash-2.4./bin/logstash -f /usr/local/logstash-2.4./logstash.conf & # 启动

# 进入测试阶段,导入一段日志文件,查看是否有输出

{
"message" => "125.118.134.85 - - [18/Sep/2016:14:06:58 +0800] \"POST / HTTP/1.0\" 200 8317 \"-\" \"-\" \"ptv.giv.tv\" \"-\" cid=3&tvtoken=78%3A0a%3Ac7%3A01%3A7b%3Ae1&year=0&tag=0&version=1.0&area=0&method=bftv.video.list&extend=isVip&sn=600000MW600T165J1764_5188&page=4&pageSize=20&apptoken=282340ce12c5e10fa84171660a2054f8&time=1474178818312&channel=0&hot=1&plateForm=bftv_android \"125.118.134.85\"",
"@version" => "",
"@timestamp" => "2016-09-18T06:07:30.425Z",
"path" => "/tmp/access.log",
"host" => "king",
"type" => "nginx_access"
}
{
"message" => "59.172.199.235 - - [18/Sep/2016:14:06:58 +0800] \"POST / HTTP/1.0\" 200 822 \"-\" \"-\" \"ptv.giv.tv\" \"-\" tvtoken=78%3A0a%3Ac7%3A04%3Aa9%3Ac0&version=1.0&method=bftv.tv.topicpiclist&sn=600000MW301D167B3808_214E&apptoken=282340ce12c5e10fa84171660a2054f8&time=1474178817053&plateForm=bftv_android \"59.172.199.235\"",
"@version" => "",
"@timestamp" => "2016-09-18T06:07:30.425Z",
"path" => "/tmp/access.log",
"host" => "king",
"type" => "nginx_access"
}

# 屏幕立即出现数据,说明客户端 LogStash 配置无误。

二、ELK-Stack:Redis 客户端将日志写入 Redis

shell > yum -y install gcc

shell > cd /usr/local/src
shell > wget http://download.redis.io/releases/redis-3.2.3.tar.gz
shell > tar zxf redis-3.2..tar.gz
shell > cd redis-3.2.; make; make install shell > mkdir /usr/local/redis-3.2.; cp redis.conf ../../redis-3.2.; cd ~ shell > sed -i 's/bind 127.0.0.1/bind 127.0.0.1 192.168.1.25/' /usr/local/redis-3.2./redis.conf
shell > sed -i '/daemonize/s/no/yes/' /usr/local/redis-3.2./redis.conf
shell > sed -i 's#dir ./#dir /data/redis_data#' /usr/local/redis-3.2./redis.conf shell > redis-server /usr/local/redis-3.2./redis.conf shell > redis-cli ping
PONG
shell > redis-cli -h 192.168.1.25 ping
PONG

# 进入测试阶段,修改客户端 LogStash 配置文件,使其收集到的日志输出到该 Redis 中。

shell > vim /usr/local/logstash-2.4./logstash.conf

# Logstash

input {
file {
type => "nginx_access"
path => ["/tmp/access.log"]
start_position => "beginning"
}
} output {
# stdout {
# codec => rubydebug
# }
redis {
host => "192.168.1.25"
port =>
data_type => "list"
key => "logstash-list"
}
}

# 回到 ELK-Stack:Redis 上查看数据,结果为空... 问题不大,因为客户端 LogStash 上次读取的日志文件是输出到屏幕,而不是 Redis

shell > redis-cli
127.0.0.1:> keys *
(empty list or set)

# 重新导入一段日志测试

shell > redis-cli
127.0.0.1:> keys *
) "logstash-list"

# 再次查看,redis 中已经有数据了。可以证明,工作流程中第一步正常。

shell > lrange logstash-list
) "{\"message\":\"58.39.181.33 - - [18/Sep/2016:14:06:45 +0800] \\\"POST / HTTP/1.0\\\" 200 352 \\\"-\\\" \\\"-\\\" \\\"ptv.giv.tv\\\" \\\"-\\\" tvtoken=78%3A0a%3Ac7%3A01%3A49%3A97&requestplatform=4&version=1.0&method=core.pic.list&sn=600000MW300D165J0484_8B59&apptoken=282340ce12c5e10fa84171660a2054f8&type=10&time=1474178780284&plateForm=bftv_android \\\"58.39.181.33\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-09-18T06:37:46.961Z\",\"path\":\"/tmp/access.log\",\"host\":\"king\",\"type\":\"nginx_access\"}"

# key:logstash-list 中第一个值得信息如上,正式日志信息。
# 查看该 key 的所有值:lrange logstash-list 0 -1 ,发现第一个到最后一个总共有 110 条,然后 wc -l < /tmp/access.log 发现也是 110 条,证明数据无误。

三、ELK-Stash:LogStash 服务端 LogStash 从 Redis 读取数据并存入 ElasticSearch

shell > vim /usr/local/logstash-2.4./logstash.conf
# Logstash.conf input {
redis {
host => "127.0.0.1"
port =>
data_type => "list"
key => "logstash-list"
}
} output {
stdout {
codec => rubydebug
}
} shell > /usr/local/logstash-2.4./bin/logstash -f /usr/local/logstash-2.4./logstash.conf -t
Configuration OK shell > /usr/local/logstash-2.4./bin/logstash -f /usr/local/logstash-2.4./logstash.conf # 调试

# 再次追加日志,查看有无输出

       "message" => "125.118.134.85 - - [18/Sep/2016:14:06:58 +0800] \"POST / HTTP/1.0\" 200 8317 \"-\" \"-\" \"ptv.giv.tv\" \"-\" cid=3&tvtoken=78%3A0a%3Ac7%3A01%3A7b%3Ae1&year=0&tag=0&version=1.0&area=ideo.list&extend=isVip&sn=600000MW600T165J1764_5188&page=4&pageSize=20&apptoken=282340ce12c5e10fa84171660a2054f8&time=1474178818312&channel=0&hot=1&plateForm=bftv_android \"125.",
"@version" => "",
"@timestamp" => "2016-09-18T08:36:11.621Z",
"path" => "/tmp/access.log",
"host" => "king",
"type" => "nginx_access"
}
{
"message" => "59.172.199.235 - - [18/Sep/2016:14:06:58 +0800] \"POST / HTTP/1.0\" 200 822 \"-\" \"-\" \"ptv.gv.tv\" \"-\" tvtoken=78%3A0a%3Ac7%3A04%3Aa9%3Ac0&version=1.0&method=bftv.tv.topicpicli01D167B3808_214E&apptoken=282340ce12c5e10fa84171660a2054f8&time=1474178817053&plateForm=bftv_android \"59.172.199.235\"",
"@version" => "",
"@timestamp" => "2016-09-18T08:36:11.622Z",
"path" => "/tmp/access.log",
"host" => "king",
"type" => "nginx_access"
}

# 至此,说明 ELK-Stack:LogStash 可以正常从 ELK-Stack:redis 读取数据,下面将读取到的数据写入到 ElasticSearch 。
# 注意:这只是个示例,将来还要将日志条目拆分,然后写入到 Kibana 才能更好的分析日志 ( filter )
# http://kibana.logstash.es/content/

shell > yum -y install java

shell > cd /usr/local/src
shell > wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.0/elasticsearch-2.4.0.tar.gz
shell > tar zxf elasticsearch-2.4..tar.gz
shell > mv elasticsearch-2.4. ../; cd ~ shell > useradd elast
shell > chown -R elast.elast /usr/local/elasticsearch-2.4. shell > vim /usr/local/elasticsearch-2.4./config/elasticsearch.yml # 编辑配置文件 cluster.name: my-elk # 集群名称 node.name: node- # 节点名称 path.data: /data/esearch/data # 数据存放路径
path.logs: /data/esearch/logs # 日志 network.host: 192.168.1.26 # 监听地址
http.port: # 监听端口 discovery.zen.ping.unicast.hosts: ["192.168.1.26", "192.168.1.27"] # 指定谁可以成为 Master ,如不指定无法加入到集群中 shell > mkdir -p /data/esearch/{data,logs}
shell > chown -R elast.elast /data/esearch shell > su - elast -c "/usr/local/elasticsearch-2.4.0/bin/elasticsearch -d" shell > echo 'su - elast -c "/usr/local/elasticsearch-2.4.0/bin/elasticsearch -d"' >> /etc/rc.local

# 简单测试 ElasticSearch

shell > curl -X GET 192.168.1.26:/_cat/nodes?v
host ip heap.percent ram.percent load node.role master name
192.168.1.26 192.168.1.26 0.10 d * node-

# 发现当前集群只有一个节点,名称为 node-1 ,角色为 master 。
# 好了,按照这个步骤开始安装下一台节点服务器。
# 注意:集群名称必须一致,节点名称必须不一致,防火墙开启 TCP 9200/9300,9300 用于节点间通信。

# node-2 安装略

shell > curl -X GET 192.168.1.27:/_cat/nodes?v
host ip heap.percent ram.percent load node.role master name
192.168.1.27 192.168.1.27 0.23 d m node-
192.168.1.26 192.168.1.26 0.04 d * node-

# 搭建好 node-2,再次查看节点信息,显示集群中有两个节点,node-1 角色为 master,node-2 角色 m 代表可以成为 master。

curl -X GET 192.168.1.26:/_cat/nodes?v
host ip heap.percent ram.percent load node.role master name
192.168.1.26 192.168.1.26 0.32 d * node-
192.168.1.27 192.168.1.27 0.06 d m node-

# 再次从 node-1 上查看节点信息,发现一致。
# 至此,ElasticSearch 集群安装完毕,默认 master 为 node-1,下面开始配置 LogStash 将数据存入 ElasticSearch 集群。

shell > vim /usr/local/logstash-2.4./logstash.conf

output {
# stdout {
# codec => rubydebug
# }
elasticsearch {
hosts => ["192.168.1.26:9200"]
index => "logstash-%{type}-%{+YYYY.MM.dd}"
document_type => "%{type}"
workers =>
flush_size =>
idle_flush_time =>
template_overwrite => true
}
}

# 记得重启服务
# 再次追加日志,然后查看 ElasticSearch 索引信息

shell > curl -X GET 192.168.1.26:/_cat/indices
green open logstash-nginx_access-2016.09. .3kb .8kb

# 查看 ElasticSearch 索引情况

shell > curl -X GET 192.168.1.26:/_cat/shards?v
index shard prirep state docs store ip node
logstash-nginx_access-2016.09. r STARTED .8kb 192.168.1.26 node-
logstash-nginx_access-2016.09. p STARTED .8kb 192.168.1.27 node-
logstash-nginx_access-2016.09. p STARTED .3kb 192.168.1.26 node-
logstash-nginx_access-2016.09. r STARTED .3kb 192.168.1.27 node-
logstash-nginx_access-2016.09. r STARTED .9kb 192.168.1.26 node-
logstash-nginx_access-2016.09. p STARTED .9kb 192.168.1.27 node-
logstash-nginx_access-2016.09. p STARTED .5kb 192.168.1.26 node-
logstash-nginx_access-2016.09. r STARTED .5kb 192.168.1.27 node-
logstash-nginx_access-2016.09. p STARTED .6kb 192.168.1.26 node-
logstash-nginx_access-2016.09. r STARTED .6kb 192.168.1.27 node-

# 至此,ELK:LogStash 读取 Redis 信息写入 ElasticSearch 完成。

四、ELK:Kibana 去读取 ElasticSearch 数据并展示

shell > cd /usr/local/src
shell > wget https://download.elastic.co/kibana/kibana/kibana-4.6.1-linux-x86_64.tar.gz
shell > tar zxf kibana-4.6.-linux-x86_64.tar.gz
shell > mv kibana-4.6.-linux-x86_64 ../; cd shell > vim /usr/local/kibana-4.6.-linux-x86_64/config/kibana.yml elasticsearch.url: "http://192.168.1.26:9200" shell > /usr/local/kibana-4.6.-linux-x86_64/bin/kibana > /data/logs/kibana.log &

# 防火墙开放 TCP 5601 端口。访问 http://192.168.1.25:5601
# 剩下的工作就是根据业务,来抓取、拆分日志,并制作图标等。

五、留一份配置文件

1、客户端 LogStash

# Logstash

input {
file {
type => "nginx_access"
path => ["/tmp/access.log"]
start_position => "beginning"
}
} output { # stdout {
# codec => rubydebug
# } redis {
host => "192.168.1.25"
port =>
data_type => "list"
key => "logstash-list"
}
}

2、服务端 LogStash

# Logstash.conf

input {
redis {
host => "127.0.0.1"
port =>
data_type => "list"
key => "logstash-list"
}
} output { # stdout {
# codec => rubydebug
# } elasticsearch {
hosts => ["192.168.1.26:9200"]
index => "logstash-%{type}-%{+YYYY.MM.dd}"
document_type => "%{type}"
workers =>
flush_size =>
idle_flush_time =>
template_overwrite => true
}
}

3、ElasticSearch

shell > grep -vP '^#|^$' /usr/local/elasticsearch-2.4./config/elasticsearch.yml 

cluster.name: my-elk
node.name: node-
path.data: /data/esearch/data
path.logs: /data/esearch/logs
network.host: 192.168.1.26
http.port:
discovery.zen.ping.unicast.hosts: ["192.168.1.26","192.168.1.27"]

# End

ELK-Stack 最后一次全篇文档的更多相关文章

  1. ELK Stack 5.2.2 安装文档

    简介: ELK Stack 安装文档,这次都使用最新版本(5.2.2).RPM 包的方式搭建 ELK Stack. 下载地址: https://artifacts.elastic.co/downloa ...

  2. 为什么开发者热衷在Stack Overflow上查阅API文档?

    摘要:一项新研究跟踪了Android开发者的访问历史,发现开发者多达二分之一的文档是从Stack Overflow上获取到的,而Stack Overflow上的示例也多于官方指南,开发者通过搜索更多时 ...

  3. ELK Stack企业日志平台文档

                                          ELK Stack企业日志平台文档           实验环境 主机名 IP地址 配置 系统版本 用途 controlno ...

  4. Elastic Stack 笔记(四)Elasticsearch5.6 索引及文档管理

    博客地址:http://www.moonxy.com 一.前言 在 Elasticsearch 中,对文档进行索引等操作时,既可以通过 RESTful 接口进行操作,也可以通过 Java 也可以通过 ...

  5. elk实战分析nginx日志文档

    elk实战分析nginx日志文档 架构: kibana <--- es-cluster <--- logstash <--- filebeat 环境准备:192.168.3.1 no ...

  6. ELK( ElasticSearch+ Logstash+ Kibana)分布式日志系统部署文档

    开始在公司实施的小应用,慢慢完善之~~~~~~~~文档制作 了好作运维同事之间的前期普及.. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 软件下载地址: https://www.e ...

  7. 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  8. ELK安装文档

    ELK安装文档: http://cuidehua.blog.51cto.com/5449828/1769525 如何将客户端日志通过ogstash-forwarder发送给服务端的logstash h ...

  9. 解决Mongoose 返回的文档过大导致模板引擎art-template无法渲染的问题,错误-RangeError: Maximum call stack size exceeded

    参考:https://blog.csdn.net/qq_40659195/article/details/88411838 最近尝试用Node写一个小案例,使用到了MongoDB,使用过的人可以知道, ...

随机推荐

  1. Quartz 2D编程指南(2) - 图形上下文

    一个Graphics Context表示一个绘制目标.它包含绘制系统用于完成绘制指令的绘制参数和设备相关信息.Graphics Context定义了基本的绘制属性,如颜色.裁减区域.线条宽度和样式信息 ...

  2. 获得消息的x,y的窗口内坐标(包括边框和titlebar高度

    rectWindow = D2D.GetWindowRect(self.hwnd)#窗口大小 rectClient = D2D.GetWindowRect(self.hwnd,True)#客户区大小 ...

  3. normalizr api 转换类库使用

    1. 项目初始化 yarn init yarn add normalizr 项目结构 app.js package.json user.json 2. 使用 a. app.js const userj ...

  4. EditPlus 3.41 p1115 0728注册码

    EditPlus (2012-7-28 epp341p1115_0728) 注册码: 注册名:Free User 注册码:6AC8D-784D8-DDZ95-B8W3A-45TFA 注册名:Www.S ...

  5. springboot中 简单的SpringMvc全局异常处理

    1.全局异常处理类:GlobalExceptionHandler.java package com.lf.exception; import java.util.HashMap; import jav ...

  6. 如何使用 nslookup 查域名的 ttl

    如何使用 nslookup 查域名的 ttl nslookup 经常用,但是最近才使用到查 ttl 的信息. 域名的 ttl 也是网站优化的一个重要参数. nslookup -d www.fastad ...

  7. (转)Android内存泄漏分析及调试

      http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析  首先了解一下dalvik的Ga ...

  8. 各大互联网公司2014前端笔试面试题–HTML,CSS篇

    Html篇: 1.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? IE: trident内核 Firefox:gecko内核 Safari:webkit内核 Opera:以前是presto ...

  9. idea之jrebel热部署使用教程

    JRebel是一个J2EE热部署的工具.使用它可以减少浪费8-18%的开发时间在项目的构建和部署上.虽然Java也提供了HotSpot的JVM,但是如果你修改的类中有方法名称变动的话,HotSpot就 ...

  10. AIDL初识

    AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言. AIDL的设计是为了实现进程间通信,如同两个进程的桥梁,传输一 ...