使用Logstash支持不同种类的日志
我正在尝试使用Logstash收集日志,在同一个文件中有不同类型的日志。 如果日志中存在某些字段,我希望提取这些字段,否则就执行其他操作使用Logstash支持不同种类的日志,logstash,kibana,logstash-grok,Logstash,Kibana,Logstash Grok,我正在尝试使用Logstash收集日志,在同一个文件中有不同类型的日志。 如果日志中存在某些字段,我希望提取这些字段,否则就执行其他操作 input{ file { path => ["/home/ubuntu/XXX/XXX/results/**/log_file.txt"] start_position => "beginning" } } f
input{
file {
path => ["/home/ubuntu/XXX/XXX/results/**/log_file.txt"]
start_position => "beginning"
}
}
filter {
grok{
match => { "message" => ["%{WORD:logger} %{SPACE}\-%{SPACE} %{LOGLEVEL:level} %{SPACE}\-%{SPACE} %{DATA:message} %{NUMBER:score:float}",
"%{WORD:logger} %{SPACE}\-%{SPACE} %{LOGLEVEL:level} %{SPACE}\-%{SPACE} %{DATA:message}"]}
}
}
output{
elasticsearch {
hosts => ["X.X.X.X:9200"]
}
stdout { codec => rubydebug }
}
例如,日志类型1是:
根-信息-最佳成绩:35.732
第二类是:
根-信息-开始实验
我面临的一个问题是,当消息不包含数字时,该字段在创建的JSON中仍然以null形式存在,这使我无法在Kibana中使用所需的功能。一个选项,就是在logstash上添加一个标记,而该字段未定义为能够在Kibana端轻松过滤。空值仅在elasticsearch中插入时设置(在日志存储端,未定义字段) 在您的情况下,此解决方案如下所示:
filter {
grok{
match => { "message" => ["%{WORD:logger} %{SPACE}\-%{SPACE} %{LOGLEVEL:level} %{SPACE}\-%{SPACE} %{DATA:message} %{NUMBER:score:float}",
"%{WORD:logger} %{SPACE}\-%{SPACE} %{LOGLEVEL:level} %{SPACE}\-%{SPACE} %{DATA:message}"]}
}
if ![score] {
mutate { add_tag => [ "score_not_set" ] }
}
}
所有那些
%{SPACE}
引用都没有做任何事情-它们捕获了“零个或多个空间”,在本例中,它们都捕获了“零个空间”。如果没有它们,它将更具可读性。您可能希望尝试以({NUMBER:score:float})结尾合并两个grok模式。$