Logstash——Logstash从Redis中收集数据并输出

之前关于logstash数据源的文章,可以看这里

Logstash——配置介绍,数据输入配置(input)
Logstash——Logstash从MySQL中收集数据并输出添加

之前介绍过如何使用文件系统通过Logstash将数据推送至elasticsearch来实现日志的线上分析。而这次介绍的是使用redis作为数据源进行数据操作的方法

Logstash-Redis数据源配置

最开始先看下Redis作为数据来源时支持的所有配置

input {
  jdbc {
	### 使用EVAL从Redis返回的事件数,此属性仅在list模式下起作用。
    batch_count => 
	### 以“旧名称”⇒“新名称”的形式配置重命名的redis命令。
	command_map => 
	### 指定列表或频道。["list", "channel", "pattern_channel"]
	data_type => 
	### Redis数据库号。
	db => 
	### Redis服务器的主机名。
	host => 
	### Redis服务器的unix套接字路径。
	path => 
	### Redis列表或通道的名称。
	key => 
	### 用于验证的密码。默认情况下没有身份验证。要连接的端口。
	password => 
	### 要连接的端口。
	port => 
	### 启用SSL支持。
	ssl => 
	### 运行线程
	threads => 
	### 超时时间
	timeout => 
  }
}

完成Logstash从MySQL中收集数据

安装Logstash

这里可以看之前的文章安装Logstash并完成一个简单的日志收集功能

Logstash配置

redis作为数据来源的数据监听模式

Redis的输入插件,提供了一个data_type,不同的参数设置会采用不同的redis命令操作。目前可配置的值为:

参数值 redis模式
list BLPOP
channel SUBSCRIBE
pattern_channel PSUBSCRIBE
  1. list

其中list,相当于队列;

  1. channel 和 pattern_channel

channel相当于发布订阅的某个特定的频道;pattern_channel相当于发布订阅某组频道。

list模式

list模式其实就是队列模式,我们向redis某个key中插入数据,然后logstash持续的从此key中取出数据

JAVA代码向redis插入数据

public void pushJob(String value) {
        BoundListOperations ops = redisTemplate.boundListOps("key");
        ops.leftPush(value);
}

如果使用list模式作为redis的数据模式的话可以使用下面配置

input {
	redis {
		key => "logstash-list"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "list"
		type  => "one"
	}
}
output {
	elasticsearch {
		hosts => "http://localhost:9200"
		index => "redis_test_list_one"
		user => exception_user # 此为es的账号,应用配置时删除注释
		password => exception # 此为es的密码,应用配置时删除注释
	}
  stdout {}
}

当应用list模式的时候,此时监听的队列同一时间只可能有一个logstash管道获得数据,关于这个效果我们可以启动两个logstash来进行试验,当然还有一个更简单的方法。

下面配置中定义了两个redis的数据源都指向了一个redis的同一个key。通过type来标记不同的数据通道

input {
	redis {
		key => "logstash-list"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "list"
		type  => "one"
	}
	redis {
		key => "logstash-list"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "list"
		type  => "two"
	}
}
output {
		stdout { codec => rubydebug }
}	

在启动了上面配置后,当向key插入一条数据后,控制台可以看到下面效果:

在这里插入图片描述

新增的数据,可能出现在one数据通道也可能two数据通道但是只会在其中一个通道出现。并且数据最终被哪个数据通道所获得也是随机的。

channel模式

channel相当于发布订阅的某个特定的频道。这里需要使用redis的channel的方式保存数据。关于JAVA代码向Redis通道保存数据我之前有介绍过 Redis实现简单的发布订阅以及配置序列化方式

如果使用channel模式作为redis的数据模式的话可以使用下面配置

input {
	redis {
		key => "logstash-channel"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "channel"
		type  => "one"
	}
}
output {
	elasticsearch {
		hosts => "http://localhost:9200"
		index => "redis_test_list_one"
		user => exception_user # 此为es的账号,应用配置时删除注释
		password => exception # 此为es的密码,应用配置时删除注释
	}
  stdout {}
}

和上面一样我们想测试channel在多个实例监听其channel的时候可以使用类似配置

input {
	redis {
		key => "logstash-channel"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "channel"
		type  => "one"
	}
	redis {
		key => "logstash-channel"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "channel"
		type  => "two"
	}
}
output {
  stdout { codec => rubydebug }
}

此时向redis添加数据,数据会出现在logstash的两个通道中

在这里插入图片描述

关于redis的文字编码

需要注意,当使用java向redis中插入数据时候,可能因为数据或者key编码问题。导致key中出现\xac\xed\x00\x05t这样的乱码,或者数据为无法识别的内容时可以参考我之前介绍redis数据序列化的内容。将数据进行处理。
Redis实现简单的发布订阅以及配置序列化方式

关于redis作为数据源个人看法

和之前介绍的MySql相比,redis提供的队列以及发布订阅的功能可以应用的场景更加丰富。一个轻量级的消息队列,在对数据安全要求不是非常高的情况下可以满足绝大多数的需求了。对一些日志的转发、一些较大数据的分析都可以通过redis来作为数据源经过logstash引入的ES进行分析或者其他地方进行处理。


个人水平有限,上面的内容可能存在没有描述清楚或者错误的地方,假如开发同学发现了,请及时告知,我会第一时间修改相关内容。假如我的这篇内容对你有任何帮助的话,麻烦给我点一个赞。你的点赞就是我前进的动力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章