我们可以将 logstash 输入配置为只监听特定的主机集吗?
Can we configure logstash input to listen onlyto paricular set of hosts
目前我的 logstash 输入正在侦听端口 XXXX 上的 filebeat,我的要求是仅从特定主机(假设仅从 Web 服务器)收集日志数据。我不想直接在服务器上修改 filebeat 配置,但我只想允许 web 服务器日志监听。
谁能建议在这种情况下如何配置 logstash?以下是 mylogstash 输入配置。
**input {
beats {
port => 50XX
}
}**
一句话,“不”,你不能配置输入来限制它接受来自哪些主机的输入。你可以做的是从你不感兴趣的主机上删除事件。如果你想接受输入的主机集很小,那么你可以使用条件
if [beat][hostname] 不在 [ "hosta", "hostb", "hostc" ] { drop {} }
同样,如果您的主机名遵循固定模式,您可以使用正则表达式
if [beat][hostname] !~ /web\d+$/ { drop {} }
将删除名称未以 web 后跟数字结尾的任何主机的事件。
如果您有大量主机,您可以使用翻译过滤器来确定它们是否在集合中。例如,如果您创建一个包含主机列表的 csv 文件
hosta,1
hostb,1
hostc,1
然后使用
进行查找
translate {
field => "[beat][hostname]"
dictionary_path => "/some/path/foo.csv"
destination => "[@metadata][field]"
fallback => "dropMe"
}
if [@metadata][field] == "dropMe" { drop {} }
@Badger - 感谢您的回复!
正如您正确提到的那样,我有大量主机,并且我所有的网络服务器都遵循命名约定(例如 xxxwebxxx)。能否请您简单介绍一下
translate {
field => "[beat][hostname]"
dictionary_path => "/some/path/foo.csv"
destination => "[@metadata][field]"
fallback => "dropMe"
}
if [@metadata][field] == "dropMe" { drop {}
此外,请建议如何将以上内容添加到我的 logstash.conf,PFB 这就是我的 logstash.conf 的样子
input {
beats {
port => 5xxxx
}
}
filter {
if [type] == "XXX" {
grok {
match => [ "message", '"%{TIMESTAMP_ISO8601:logdate}"\t%{GREEDYDATA}']
}
grok {
match => [ "message", 'AUTHENTICATION-(?<xxx_status_code>[0-9]{3})']
}
grok {
match => [ "message", 'id=(?<user_id>%{DATA}),']
}
if ([user_id] =~ "_agent") {
drop {}
}
grok {
match => [ "message", '%{IP:clientip}' ]
}
date {
match => [ "logdate", "ISO8601", "YYYY-MM-dd HH:mm:ss"]
locale => "en"
}
geoip {
source => "clientip"
}
}
}
output {
elasticsearch {
hosts => ["hostname:port"]
}
stdout { }
}
目前我的 logstash 输入正在侦听端口 XXXX 上的 filebeat,我的要求是仅从特定主机(假设仅从 Web 服务器)收集日志数据。我不想直接在服务器上修改 filebeat 配置,但我只想允许 web 服务器日志监听。
谁能建议在这种情况下如何配置 logstash?以下是 mylogstash 输入配置。
**input {
beats {
port => 50XX
}
}**
一句话,“不”,你不能配置输入来限制它接受来自哪些主机的输入。你可以做的是从你不感兴趣的主机上删除事件。如果你想接受输入的主机集很小,那么你可以使用条件
if [beat][hostname] 不在 [ "hosta", "hostb", "hostc" ] { drop {} }
同样,如果您的主机名遵循固定模式,您可以使用正则表达式
if [beat][hostname] !~ /web\d+$/ { drop {} }
将删除名称未以 web 后跟数字结尾的任何主机的事件。
如果您有大量主机,您可以使用翻译过滤器来确定它们是否在集合中。例如,如果您创建一个包含主机列表的 csv 文件
hosta,1
hostb,1
hostc,1
然后使用
进行查找translate {
field => "[beat][hostname]"
dictionary_path => "/some/path/foo.csv"
destination => "[@metadata][field]"
fallback => "dropMe"
}
if [@metadata][field] == "dropMe" { drop {} }
@Badger - 感谢您的回复! 正如您正确提到的那样,我有大量主机,并且我所有的网络服务器都遵循命名约定(例如 xxxwebxxx)。能否请您简单介绍一下
translate {
field => "[beat][hostname]"
dictionary_path => "/some/path/foo.csv"
destination => "[@metadata][field]"
fallback => "dropMe"
}
if [@metadata][field] == "dropMe" { drop {}
此外,请建议如何将以上内容添加到我的 logstash.conf,PFB 这就是我的 logstash.conf 的样子
input {
beats {
port => 5xxxx
}
}
filter {
if [type] == "XXX" {
grok {
match => [ "message", '"%{TIMESTAMP_ISO8601:logdate}"\t%{GREEDYDATA}']
}
grok {
match => [ "message", 'AUTHENTICATION-(?<xxx_status_code>[0-9]{3})']
}
grok {
match => [ "message", 'id=(?<user_id>%{DATA}),']
}
if ([user_id] =~ "_agent") {
drop {}
}
grok {
match => [ "message", '%{IP:clientip}' ]
}
date {
match => [ "logdate", "ISO8601", "YYYY-MM-dd HH:mm:ss"]
locale => "en"
}
geoip {
source => "clientip"
}
}
}
output {
elasticsearch {
hosts => ["hostname:port"]
}
stdout { }
}