elk系列8之logstash+redis+es的架构来收集apache的日志【转】
preface
logstash--> redis --> logstash --> es这套架构在讲究松耦合关系里面是最简单的,
架构图如下:
解释下这个架构图的流程
- 首先前端logstash读取apache的日志(input读取)。然后放到redis的db里面(output存入)。存储形式为列表形式存放
- 后端logstash从redis读取日志内容(input读取),从前端logstash指定的库里面读取指定的key。读取之后filter(filter-grok)过滤。然后传送到es上(output推送)。
- es接受日志,处理。
我们可以参考官网的建议:https://www.elastic.co/guide/en/logstash/2.3/deploying-and-scaling.html#deploying-message-queueing
废话不多说,我们开始着手配置吧,。
安装redis
在linux-node2节点上操作
安装redis,并且启动,
[root@linux-node2 conf.d]# yum -y install redis # 确保一定是2.4版本以上的,不然logstash input的时候会报错的
[root@linux-node2 conf.d]# grep bind /etc/redis.conf
bind 0.0.0.0 # 这里记得修改监听地址
确认无误后启动redis
[root@linux-node2 conf.d]# /etc/init.d/redis start
配置logstash
linux-node1操作
logstash对应的模块是output里面的redis模块,当然,也可以支持rabbitMQ,选择redis是因为redis性能强,而且配置简单。那么为啥要在output上做呢,是因为output是logstash的输出,直接对接在redis上,所以是ouput。
下面就看看官网对redis模块的讲解:https://www.elastic.co/guide/en/logstash/2.3/plugins-outputs-redis.html
下面贴下logstash配置,这里把屏幕输入传送到redis上
[root@linux-node1 conf.d]# cat redis.conf
input {
stdin {
}
}
output {
redis {
host => "192.168.141.4"
port => "6379"
db => "6" # 选择那个库
data_type => "list" # 存入数据的类型
key => "demo" # 数据的键
}
}
随便回车敲入一些内容,使其redis库里面有东西
查看redis结果
我们到登陆redis后查看内容:
redis 127.0.0.1:6379> select 6 # 切换到数据库6下面
OK
redis 127.0.0.1:6379[6]> keys *
1) "demo"
redis 127.0.0.1:6379[6]> type demo
list
redis 127.0.0.1:6379[6]> llen demo # 查看列表长度
(integer) 3
redis 127.0.0.1:6379[6]> lindex demo -1 # 从redis的左边取第一位
"{\"message\":\"man\",\"@version\":\"1\",\"@timestamp\":\"2016-12-11T07:18:44.751Z\",\"host\":\"linux-node1\"}"
到此,可以说明logstash的output和redis已经能够正常的工作了
收集apache的日志
linux-node1操作
我们此时更改下logstash的配置,配置如下:
[root@linux-node1 conf.d]# cat /etc/logstash/conf.d/redis.conf
input {
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
}
}
output {
redis {
host => "192.168.141.4"
port => "6379"
db => "6"
data_type => "list"
key => "apache"
}
}
配置确认无误后,启动logstash
[root@linux-node1 conf.d]# /opt/logstash/bin/logstash -f redis.conf
此时切换到linux-node2的终端上查看
redis 127.0.0.1:6379[6]> keys *
1) "demo"
2) "apache" # 出现这个key了
redis 127.0.0.1:6379[6]> llen apache
(integer) 2002
redis 127.0.0.1:6379[6]> lindex apache 0
"{\"message\":\"192.168.141.4 - - [11/Dec/2016:15:54:09 +0800] \\\"GET / HTTP/1.0\\\" 403 4961 \\\"-\\\" \\\"ApacheBench/2.3\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-11T07:54:09.745Z\",\"path\":\"/var/log/httpd/access_log\",\"host\":\"linux-node1\"}" # 有内容了
下面我们在linux-node2上配置logstash,来读取redis的内容
[root@linux-node2 conf.d]# cat getredis.conf
input {
redis {
host => "192.168.141.4"
db => "6"
data_type => "list"
key => "apache"
}
}
output {
stdout{
codec => rubydebug
}
}
确认没有问题,启动logstash
[root@linux-node2 conf.d]# /opt/logstash/bin/logstash --verbose -f getredis.conf
我擦,报错了,报错内容如下,该报错内容一直刷屏:
Redis connection problem {:exception=>#<Redis::CommandError: ERR unknown command 'script'>, :level=>:warn}
出现上面这个报错的问题是因为redis版本太低,yum安装的redis版本是2.4.10的,然后我自己源码包安装的是3.2.5,步骤如下:
[root@linux-node2 tmp]# wget http://download.redis.io/releases/redis-3.2.5.tar.gz
[root@linux-node2 tmp]# tar xzf redis-3.2.5.tar.gz
[root@linux-node2 tmp]# cd redis-3.2.5
[root@linux-node2 redis-3.2.5]# make
[root@linux-node2 redis-3.2.5]# src/redis-server /etc/redis.conf #配置文件稍作更改即可,该监听地址
再次启动logstash,就可以了,完美启动
[root@linux-node2 conf.d]# /opt/logstash/bin/logstash --verbose -f getredis.conf
此时我们可以停止刚才启动的logstash,重新配置一下。
使用grok模块处理apache日志
我们再次配置下linuix-node2节点上的logstash。先找到分析apache日志的模块,然后添加filter-grok。如下所示:
首先过滤出分析apache日志的模块,方便待会调用
[root@linux-node2 conf.d]# grep APACHE /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns --color # 首先过滤出分析apache日志的模块,方便待会调用
COMMONAPACHELOG %{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)
COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}
配置logstash
添加filter-grok。
[root@linux-node2 conf.d]# cat getredis.conf
input {
redis {
host => "192.168.141.4"
db => "6"
data_type => "list"
key => "apache"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
output {
elasticsearch {
hosts => ["192.168.141.3:9200"]
index => "apache-log-%{+YYYY.MM}"
}
}
确认无误后,再次启动logstash
[root@linux-node2 conf.d]# /opt/logstash/bin/logstash --verbose -f getredis.conf
访问下apache,然后我们在head上就可以看到apapche的日志。
转自
elk系列8之logstash+redis+es的架构来收集apache的日志 - 温柔易淡 - 博客园
http://www.cnblogs.com/liaojiafa/p/6160215.html
elk系列8之logstash+redis+es的架构来收集apache的日志【转】的更多相关文章
- elk系列8之logstash+redis+es的架构来收集apache的日志
preface logstash--> redis --> logstash --> es这套架构在讲究松耦合关系里面是最简单的, 架构图如下: 解释下这个架构图的流程 首先前端lo ...
- ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例
前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...
- ELK系列五:Logstash输出到Elasticsearch和redis
1.Logstash与Redis的读写 1.1 Logstash 写入Redis 看完Logstash的输入,想必大家都清楚了Logstash的基本用法,那就是写配置文件. output{ { red ...
- ELK系列四:Logstash的在ELK架构中的使用和简单的输入
1.ELK架构中Logstash的位置: 1.1.小规模集群部署(学习者适用的架构) 简单的只有Logstash.Elasticsearch.Kibana,由Logstash收集日志或者流量信息,过滤 ...
- ELK系列六:Logstash的Filter模块
Date过滤 input { stdin{ codec => plain } } filter { date { match => ["message", " ...
- ELK:收集k8s容器日志最佳实践
简介 关于日志收集这个主题,这已经是第三篇了,为什么一再研究这个课题,因为这个课题实在太重要,而当今优秀的开源解决方案还不是很明朗: 就docker微服务化而言,研发有需求标准输出,也有需求文件输出, ...
- ELK系列(5) - Logstash怎么分割字符串并添加新的字段到Elasticsearch
问题 有时候我们想要在Logstash里对收集到的日志等信息进行分割,并且将分割后的字符作为新的字符来index到Elasticsearch里.假定需求如下: Logstash收集到的日志字段mess ...
- ELK系列(7) - 测试环境下Logstash异常退出:block in multi_receive_encoded
问题与分析 在本地测试无误后将ELK部署到了测试环境,结果第二天发现Logstash挂掉了,一开始以为是自动部署之类导致的问题.之后几天时间里Logstash总是会down掉,查看了下日志文件,发现报 ...
- elk系列7之通过grok分析apache日志【转】
preface 说道分析日志,我们知道的采集方式有2种: 通过grok在logstash的filter里面过滤匹配. logstash --> redis --> python(py脚本过 ...
随机推荐
- OSPF协议介绍及配置 (下)
4.特殊区域详解 为了让我们的讲解更加的通俗易懂,我们看上面这个拓扑,这是一个根据客户业务逻辑结构所涉及的OSPF网络,共有三个区域(实际上远远不止),骨干区域area0为一级行及二级行所部署,*** ...
- App简介及登录页面
一. APP目录 app目录: -migrations 数据操作记录,是自动创建的.数据修改表结构 -__init__.py #在python3里面可有可无都行 -__init__.py -admin ...
- CSS中background样式的repeat和no-repeat
自http://blog.sina.com.cn/s/blog_98eef7830101cv8t.html获取的知识,特此感谢. <!DOCTYPE html> <html lang ...
- Educational Codeforces Round 20 C 数学/贪心/构造
C. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Linux中怎么终止正在运行的后台程序
linux 任务管理-后台运行与终止fg.bg.jobs.&.ctrl + z命令一. &加在一个命令的最后,可以把这个命令放到后台执行 ,如gftp &,二.ctrl + z ...
- gdb常用命令小结
用了这么长时间gdb, 总结下常用用法: http://note.youdao.com/noteshare?id=4a2d1a34624f7197d8e2304c4beb4578
- C#获取Json字符串中的某个值
问题描述: json数据格式{"resCode":0,"resMag":"aaa","data":[{"par ...
- java项目转换依赖等问题
最近接手了一个原始的java项目,其实很久没有做了,自从两年前用maven,建立web项目,java project基本上就没有弄个,突然的接手,发现自己好多不足,可能对于一开始就做这样的容易,但是对 ...
- ⑤ 设计模式的艺术-05.原型(Prototype)模式
场景 思考一下:克隆技术是怎么样的过程? 克隆羊多利大家还记得吗? javascript语言中的,继承怎么实现?那里面也有prototype,大家还记得吗? 原型模式 通过new产生一个对象需要非常繁 ...
- 51nod1471 小S的兴趣
题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 320 小S喜欢有趣的事.但是,每个人的兴趣都是独特的.小S热衷于自问自答.有一天,小S想出了一个问题 ...