LogStash简易数据中转方案

有时一些小规模的数据中转需求,可直接使用 LogStash::Inputs::TCPLogStash::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 均可,这样才能正常处理。

标签: logstash, elk

添加新评论