我需要帮助
我有两个Logstash配置文件:
input {
log4j {
type => "bdj"
port => 25827
}
}
filter{
json{
source => "message"
}
}
output {
stdout {
codec => rubydebug
}
redis {
host => "127.0.0.1"
data_type => "list"
key => "logstash"
}
}
agent.conf 通过tcp将它们发送到redis来接收数据日志。
input {
redis {
host => "localhost"
type => "redis-input"
data_type => "list"
key => "logstash"
}
}
filter{
json{
source => "message"
}
}
output {
stdout { }
elasticsearch {
hosts => "localhost"
index => "logstash-%{+YYYY.MM.dd}"
}
}
central.conf 获取redis并将它们发送给弹性系统。
我的问题是数据被复制,作为循环或类似的东西。
我正在运行logstash作为Debian的服务;
root@logs:~# uname -a
Linux logs 3.2.0-4-amd64 #1 SMP Debian 3.2.78-1 x86_64 GNU/Linux
同时查看图像,相同的数据日志,我只发送了一个日志请求。
任何帮助?
答案 0 :(得分:0)
当我发现logstash做了奇怪的事情时,它有时会导致运行两个副本或者目录中的旧配置文件也被logstash读取。这不是每个问题,但最好检查一下。
答案 1 :(得分:0)
我遇到了同样的问题几天,直到我得到了正在发生的事情:Logstash的一个实例只有一个管道处理事件! Logstash提供了将配置拆分为不同文件以便于阅读的功能,但最后它们全部合并一起组成一个配置。
在这种情况下,在加载central.conf和agent.conf之后,Logstash实例管道有两个输入(log4j和redis),一个过滤器(应该只定义一次以避免重复)和两个输出(redis和elasticsearch) 。事件来自两个输入,通过过滤器处理,然后推送到两个输出。
来自log4j输入的事件被推送到redis输出后,再次从redis输入处理到redis输出。这是你的无限循环。
解决方案是“标记”您的事件,以便在事件的生命周期中选择性地应用过滤器和输出。所有输入插件都有一个共同选项 type ,可用于此目的。但正如在documentation中所说的那样,事件的类型是不可变的,所以一旦设置它就不能改变它。我宁愿在此上下文中使用@metadata字段,请参阅下文。
input {
log4j {
type => "bdj"
port => 25827
add_field => {
"[@metadata][event_origin]" => "log4j"
}
}
}
filter {
if [@metadata][event_origin] == "log4j" {
json {
source => "message"
}
}
}
output {
if [@metadata][event_origin] == "log4j" {
redis {
host => "127.0.0.1"
data_type => "list"
key => "logstash"
}
}
}
input {
redis {
host => "localhost"
data_type => "list"
key => "logstash"
add_field => {
"[@metadata][event_origin]" => "redis"
}
}
}
output {
if [@metadata][event_origin] == "redis" {
elasticsearch {
hosts => "localhost"
index => "logstash-%{+YYYY.MM.dd}"
}
}
}