Logstash将日志写入Redis

为什么要使用Redis

在企业中,日志规模的量级远远超出我们的想象,这就是为什么会有一家公司日志易专门做日志收集,给大型金融公司收集日志,比如银行,因为你有可能看到,1秒钟好几千万的日志量,往服务器写入,那么企业中的集群,架构都不是单台的,而是多台的,一台如果是1千万,那么5台的量级,10台的量级,我们要对他们进行收集,进行分析,难免会在网络传输过程中,丢数据。

日志是什么?
日志对于企业来说,有什么作用?
用户使用我们的产品,体验如何?
用户的客诉,我们能拿出什么样的数据来说话?
...

一系列的问题,都和日志相关,如果至关重要的那个数据丢失了,那么公司的损失可不仅仅是一条日志那么简单。如果我们不知道,用户对我们产品最感兴趣的地方在哪,那么产品的寿命也就越来越短。如果被攻击了,恶意攻击的IP源我们都找不到,那么或许就不是产品的寿命越来越短,而是这个企业存在的寿命,越来越短。

好吧,一顿排比句,说的那么浮夸,说白了,我就是想要告诉你们,一个大规模日志量级的企业想要做到数据的安全性,数据的一致性,我们需要消息队列:Redis , Kafka,在ELK5版本中,建议使用Redis来做消息队列,Kafka能不能用?也能,只不过会有一些不必要的坑,需要我们去爬。在ELK6版本中,开始使用Kafka来做消息队列。

话不多说,我们接下来就开始将Logstash收集到的日志,输出到Redis中。


Redis部署
#下载
[root@db04 ~]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz
#解压
[root@db04 ~]# tar xf redis-3.2.12.tar.gz
#移动到指定目录
[root@db04 ~]# mv redis-3.2.12 /application/
#做软链接
[root@db04 ~]# ln -s /application/redis-3.2.12 /application/redis
#进入redis目录
[root@db04 ~]# cd /application/redis
#编译
[root@db04 redis]# make
#添加环境变量
[root@db04 redis]# vim /etc/profile.d/redis.sh
export PATH="/application/redis/src:$PATH"
#创建配置文件存放目录
[root@db04 ~]# mkdir -p /data/6379
#编辑redis配置文件
[root@db04 ~]# vim /data/6379/redis.conf
port 6379
daemonize yes
pidfile /data/6379/redis.pid
logfile "/data/6379/redis.log"
dbfilename dump.rdb
dir /data/6379
protected-mode no
requirepass zls
#启动redis
[root@db04 ~]# redis-server /data/6379/redis.conf

Logstash收集日志输出至Redis
#进入Logstash配置文件目录
[root@elkstack03 ~]# cd /etc/logstash/conf.d/
#编辑Logstash配置文件
[root@elkstack03 conf.d]# vim log_to_redis.conf
input {
file {
path => "/usr/local/tomcat/logs/tomcat_access_log.*.log"
start_position => "end"
type => "tc"
}
file {
path => "/usr/local/nginx/logs/access_json.log"
start_position => "end"
type => "ngx"
codec => json
}
} output {
if [type] == "tc" {
redis {
data_type => "list"
key => "tomcat_log"
host => "10.0.0.54"
port => "6379"
db => "0"
password => "zls"
}
}
if [type] == "ngx" {
redis {
data_type => "list"
key => "nginx_log"
host => "10.0.0.54"
port => "6379"
db => "1"
password => "zls"
}
}
}
#启动Logstash
[root@elkstack03 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/log_to_redis.conf &

验证Redis数据
#连接redis
[root@elkstack04 ~]# redis-cli -a zls
#在0库中查看所有key
127.0.0.1:6379> KEYS *
1) "tomcat_log"
#查看tomcat_log的长度(日志的条数)
127.0.0.1:6379> LLEN tomcat_log
(integer) 8
#切换1库
127.0.0.1:6379> SELECT 1
OK
#在1库中查看所有key
127.0.0.1:6379[1]> KEYS *
1) "nginx_log"
#查看nginx_log的长度(日志的条数)
127.0.0.1:6379[1]> LLEN nginx_log
(integer) 6 #演示Logstash如何取走一条tomcat日志
127.0.0.1:6379> LPOP tomcat_log
"{\"path\":\"/usr/local/tomcat/logs/tomcat_access_log.2019-04-08.log\",\"@timestamp\":\"2019-04-08T13:43:35.779Z\",\"@version\":\"1\",\"host\":\"0.0.0.0\",\"message\":\"{\\\"clientip\\\":\\\"10.0.0.53\\\",\\\"ClientUser\\\":\\\"-\\\",\\\"authenticated\\\":\\\"-\\\",\\\"AccessTime\\\":\\\"[08/Apr/2019:21:43:34 +0800]\\\",\\\"method\\\":\\\"GET / HTTP/1.1\\\",\\\"status\\\":\\\"304\\\",\\\"SendBytes\\\":\\\"-\\\",\\\"Query?string\\\":\\\"\\\",\\\"partner\\\":\\\"-\\\",\\\"AgentVersion\\\":\\\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36\\\"}\",\"type\":\"tc\"}"
#再次查看长度
127.0.0.1:6379> Llen tomcat_log
(integer) 7 #演示Logstash如何取走一条nginx日志
127.0.0.1:6379[1]> LPOP nginx_log
"{\"referer\":\"-\",\"type\":\"ngx\",\"http_host\":\"www.elk.com\",\"url\":\"/index.html\",\"path\":\"/usr/local/nginx/logs/access_json.log\",\"upstreamhost\":\"-\",\"@timestamp\":\"2019-04-08T13:43:19.000Z\",\"size\":0,\"clientip\":\"10.0.0.53\",\"domain\":\"www.elk.com\",\"host\":\"10.0.0.53\",\"@version\":\"1\",\"responsetime\":0.0,\"xff\":\"10.0.0.1\",\"upstreamtime\":\"-\",\"status\":\"304\"}"
#再次查看长度
127.0.0.1:6379[1]> LLEN nginx_log
(integer) 5


Logstash从Redis中取出日志输出到ES
#进入Logstash配置文件目录
[root@elkstack03 ~]# cd /etc/logstash/conf.d/
#编辑Logstash配置文件
[root@elkstack03 conf.d]# vim redis_to_es.conf
input {
redis {
data_type => "list"
key => "tomcat_log"
host => "10.0.0.54"
port => "6379"
db => "0"
password => "zls"
codec => "json"
} redis {
data_type => "list"
key => "nginx_log"
host => "10.0.0.54"
port => "6379"
db => "1"
password => "zls"
}
} output {
if [type] == "tc" {
elasticsearch {
hosts => ["10.0.0.51:9200"]
index => "m.elk.com-%{+YYYY.MM.dd}"
}
} if [type] == "ngx" {
elasticsearch {
hosts => ["10.0.0.51:9200"]
index => "www.elk.com-%{+YYYY.MM.dd}"
}
}
}
#启动Logstash
[root@elkstack03 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis_to_es.conf &

验证Logstash中的数据是否被取出
#连接Redis
[root@elkstack04 ~]# redis-cli -a zls
#查看所有key
127.0.0.1:6379> KEYS *
(empty list or set)
#切换1库
127.0.0.1:6379> SELECT 1
OK
#查看所有key
127.0.0.1:6379[1]> KEYS *
(empty list or set)


在ES中查看数据

打开浏览器,访问:http://10.0.0.51:9100/


将ES索引添加到Kibana中

打开浏览器,访问:http://10.0.0.54:5601

查看Kibana数据

Redis key堆积监控

实际环境当中,可能会出现reids当中堆积了大量的数据而logstash由于种种原因未能及时提取日志,此时会导致redis服务器的内存被大量使用,甚至出现如下内存即将被使用完毕的情景.

[root@elkstack01 ~]# vim redis_keylenth.py
#!/usr/bin/env python
#coding:utf-8
#Author Driver_Zeng
import redis
def redis_conn():
pool=redis.ConnectionPool(host="10.0.0.54",port=6379,db=2,password='zls')
conn = redis.Redis(connection_pool=pool)
data = conn.llen('tn')
print(data)
redis_conn() [root@elkstack01 ~]# python3 redis_keylenth.py
259

第十章· Logstash深入-Logstash与Redis那点事的更多相关文章

  1. 使用Elasticsearch、Logstash、Kibana与Redis(作为缓冲区)对Nginx日志进行收集(转)

    摘要 使用Elasticsearch.Logstash.Kibana与Redis(作为缓冲区)对Nginx日志进行收集 版本 elasticsearch版本: elasticsearch-2.2.0 ...

  2. ELKStack入门篇(三)之logstash收集日志写入redis

    1.部署Redis 1.1.下载redis [root@linux-node2 ~]# wget http://download.redis.io/releases/redis-4.0.6.tar.g ...

  3. ELK快速入门(三)logstash收集日志写入redis

    ELK快速入门三-logstash收集日志写入redis 用一台服务器部署redis服务,专门用于日志缓存使用,一般用于web服务器产生大量日志的场景. 这里是使用一台专门用于部署redis ,一台专 ...

  4. 第九章·Logstash深入-Logstash配合rsyslog收集haproxy日志

    rsyslog介绍及安装配置 在centos 6及之前的版本叫做syslog,centos 7开始叫做rsyslog,根据官方的介绍,rsyslog(2013年版本)可以达到每秒转发百万条日志的级别, ...

  5. 第二章 logstash - 输出插件之redis与es

    最常用的两个输出插件: redis es 一.redis 1.用法 output { redis{ batch => false batch_events => 50 batch_time ...

  6. ELK之logstash收集日志写入redis及读取redis

    logstash->redis->logstash->elasticsearch 1.安装部署redis cd /usr/local/src wget http://download ...

  7. Logstash之Logstash inputs(file和redis插件)、Logstash outputs(elasticsearch 和redis插件)和Filter plugins

     前期博客 Logstash安装和设置(图文详解)(多节点的ELK集群安装在一个节点就好) Filebeat啊,根据input来监控数据,根据output来使用数据!!! 请移步, Filebeat之 ...

  8. 安装logstash及logstash的初步使用-处理DNS日志

    安装logstash 需要高版本的java 使用1.4版本的java会有报错 # Can't start up: not enough memory 查询java信息 rpm -qa | grep j ...

  9. 关于Redis的那些事

    1.  MySql+Memcached架构的问题 Memcached采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议格式要求,客户端Library可以用任何语言实现. ...

随机推荐

  1. 分布式存储ceph介绍(1)

    一.Ceph简介: Ceph是一种为优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统.ceph 的统一体现在可以提供文件系统.块存储和对象存储,分布式体现在可以动态扩展.在国内一些公司的云环 ...

  2. openstack部署nova

    controller 一.创建nova数据库,并设置权限及远程登录 mysql -u root -p CREATE DATABASE nova_api; CREATE DATABASE nova; C ...

  3. 【转】java获取当前年、月、日 、小时 、分钟、 秒、 毫秒

    public class Test { /** * 英文简写(默认)如:2010-12-01 */ public static String FORMAT_SHORT = "yyyy-MM- ...

  4. PTA --- L1-002 打印沙漏

    题目地址 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行符号中心对 ...

  5. Docker 面试题

    Docker 面试题 Docker? Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行. CI(持续集成)服务器的功能是什么? ...

  6. Crunch黑客神器-创造个性字典

    先来看第一个命令: crunch 6 7 123456 -o pass.txt 是什么意思呢?我们打开终端,输入这个命令之后,crunch代表使用crunch这个工具,6代表生成的密码最小是6位数,7 ...

  7. [转帖]calico网络原理及与flannel对比

    calico网络原理及与flannel对比 https://blog.csdn.net/ganpuzhong42/article/details/77853131 2017年09月05日 16:34: ...

  8. 【详细解析】MySQL索引详解( 索引概念、6大索引类型、key 和 index 的区别、其他索引方式)

    [详细解析]MySQL索引详解( 索引概念.6大索引类型.key 和 index 的区别.其他索引方式) MySQL索引的概念: 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分 ...

  9. Synchronized的实现原理(汇总)

      一.Java中synchronized关键字的作用 总所周知,在并发环境中多个线程对同一个资源进行访问很可能出现脏读等一系列线程安全问题.这时我们可以用加锁的方式对访问共享资源的代码块进行加锁,以 ...

  10. ThinkPHP composer的安装,及image图像处理类库的加载

    以下教程针对windows系统,示例系统使用win7 composer安装 下载composer安装包,点击安装. 出现'composer choose the command-line php' 要 ...