LogStash简易数据中转方案
有时一些小规模的数据中转需求,可直接使用 LogStash::Inputs::TCP
和 LogStash::Outputs::TCP
来做转发工作。
在实际配置时遇到一个坑,梳理下备忘。
配置示例
简易架构图
普通接收端配置
input {
syslog {
host => "10.0.0.10"
port => "514"
}
}
filter {}
output {
redis {
host => ["10.0.0.11"]
port => 6379
data_type => "list"
codec => "json"
key => "xxlog"
timeout => 30
congestion_interval => 5
}
}
数据中转client配置
input {
syslog {
host => "192.168.0.10"
port => "514"
}
}
filter {}
output {
tcp {
host => "10.0.0.10"
port => 8888
mode => "client" //划重点
codec => json_lines //划重点
}
}
中转接收端配置
input {
tcp {
host => "10.0.0.10"
port => 8888
mode => "server" //划重点
codec => json //划重点
}
}
filter {}
output {
redis {
host => ["10.0.0.11"]
port => 6379
data_type => "list"
codec => "json"
key => "xxlog"
timeout => 30
congestion_interval => 5
}
}
配置说明
在数据中转端采用 LogStash::Outputs::TCP
方式发送给远端的 TCP 端口,这里需要注意的是,默认 LogStash::Outputs::TCP
的 codec 选项是 json
,而远端的 LogStash::Inputs::TCP
的默认 codec 选项却是 plain
!!所以不指定各自的 codec ,对接肯定是失败的。
另外,由于 IO BUFFER 的原因,即使是两端共同约定为 json
依然无法正常运行,接收端会认为一行数据没结束,一直等待直至自己 OutOfMemory !
所以,正确的做法是,发送端指定 codec 为 json_lines
,这样每条数据后面会加上一个回车,接收端指定 codec 为 json_lines
或者 json
均可,这样才能正常处理。