假设您有两种非常不同类型的日志,例如FORTINET和NetASQ日志,您想要:
使用正则表达式解析FORTINET,使用其他正则表达式使用NETASQ。
我知道输入文件中的“type”和过滤器中的“condition”可以解决这个问题。
所以我用这个confing文件来做:
input {
file {
type => "FORTINET"
path => "/fortinet/*.log"
sincedb_path=>"/logstash-autre_version/var/.sincedb"
start_position => 'beginning'
}
file {
type => "NETASQ"
path => "/home/netasq/*.log"
}
}
filter {
if [type] == "FORTINET" {
grok {
patterns_dir => "/logstash-autre_version/patterns"
match => [
"message" , "%{FORTINET}"
]
tag_on_failure => [ "failure_grok_exemple" ]
break_on_match => false
}
}
if [type] == "NETASQ" {
# .......
}
}
output {
elasticsearch {
cluster => "logstash"
}
}
我收到了这个错误:
Got error to send bulk of actions: no method 'type' for arguments(org.jruby.RubyArray) on Java::OrgElasticsearchActionIndex::IndexRequest {:level=>:error}
但是如果不使用“类型”并且我只使用FORTINET日志它就会崩溃。
我该怎么办?
答案 0 :(得分:0)
我不确定这一点但也许有帮助:
我有同样的错误,我认为它是由使用这些if语句引起的:
if [type] == "FORTINET"
您的type
字段与"FORTINET"
进行比较,但这可能无法实现,因为"FORTINET"
是一个字符串且type
不是。{1}}。有时通过将类型设置为输入,如果已经有类型,则类型不会被替换,但新类型将添加到具有旧类型的列表中。您应该查看kibana(或任何地方)的数据并尝试找到类似的内容:
\"type\":[\"FORTINET\",\"some-other-type\"]
也许没有所有\"
如果您发现类似的内容,请尽量不要明确设置输入的类型,并将if语句中的type
与您找到的some-other-type
进行比较。
希望这有效(我与更复杂的输入/转发器合作,对我而言,它没有,但值得一试)