之前关于logstash数据源的文章,可以看这里
Logstash——配置介绍,数据输入配置(input)
Logstash——Logstash从MySQL中收集数据并输出添加
之前介绍过如何使用文件系统通过Logstash将数据推送至elasticsearch来实现日志的线上分析。而这次介绍的是使用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并完成一个简单的日志收集功能
Redis的输入插件,提供了一个data_type
,不同的参数设置会采用不同的redis命令操作。目前可配置的值为:
参数值 | redis模式 |
---|---|
list | BLPOP |
channel | SUBSCRIBE |
pattern_channel | PSUBSCRIBE |
其中list,相当于队列;
channel相当于发布订阅的某个特定的频道;pattern_channel相当于发布订阅某组频道。
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相当于发布订阅的某个特定的频道。这里需要使用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的两个通道中
需要注意,当使用java向redis中插入数据时候,可能因为数据或者key编码问题。导致key中出现\xac\xed\x00\x05t这样的乱码,或者数据为无法识别的内容时可以参考我之前介绍redis数据序列化的内容。将数据进行处理。
Redis实现简单的发布订阅以及配置序列化方式
和之前介绍的MySql相比,redis提供的队列以及发布订阅的功能可以应用的场景更加丰富。一个轻量级的消息队列,在对数据安全要求不是非常高的情况下可以满足绝大多数的需求了。对一些日志的转发、一些较大数据的分析都可以通过redis来作为数据源经过logstash引入的ES进行分析或者其他地方进行处理。
个人水平有限,上面的内容可能存在没有描述清楚或者错误的地方,假如开发同学发现了,请及时告知,我会第一时间修改相关内容。假如我的这篇内容对你有任何帮助的话,麻烦给我点一个赞。你的点赞就是我前进的动力。