2

基本上,我希望 LogStash 使用自己的日志并填充诸如 、 等字段@timestamplevel在 Kibana 中使用。

我当前的配置如下所示:

input {
  file {
    path => "/path/to/logstash/logs/*.log"
    type => "logstash"
  }
}

这似乎很难做到——无需重新编写 Grok 过滤器。LogStash 真的不能消费自己的日志吗?(很难谷歌,我找不到任何东西。)

或者这首先是错误的方法?

LogStash 的示例日志输出:

{
  :timestamp=>"2014-09-02T10:38:08.798000+0200", 
  :message=>"Using milestone 2 input plugin 'file'. This plugin should be stable, but if you see strange behavior, please let us know! For more information on plugin milestones, see http://logstash.net/docs/1.4.2/plugin-milestones",
  :level=>:warn
}
4

2 回答 2

5

您必须求助于使用grok,因为logstash 无法rubydebug用作输入编解码器。

日志是固定格式的,所以grok做起来很简单。然后我们用date替换@timestamp

filter {
  grok {
      match => ["message", '{:timestamp=>"(?<timestamp>.*)", :message=>"(?<msg>.*)", :level=>:(?<level>.*)}']
  }
  mutate {
      replace => ["message", "%{msg}" ]
      remove_field => msg
  }
  date {
      match => [ "timestamp", "ISO8601" ]
      remove_field => 'timestamp'
  }
}

mutate步骤是必需的,因为如果您只是放入<message>匹配项,它将message变成一个数组并将提取的消息添加到其中,因此捕获为不同的名称,然后替换该消息。

于 2014-09-02T21:26:04.600 回答
1

是的,你可以这样做。请将您的 logstash 控制台日志保存到文件中。然后,您可以使用ruby filtergrok filter来解析出信息。

这是示例:

input {
    file {
            path => "/path/to/logstash/logs/*.log"
    }
}

filter {
    ruby {
            code => "
                    mes = event['message'];
                    startPos = mes.index('level=>');
                    endPos = mes.length;
                    event[':level'] = mes[startPos+7..endPos-2];
            "
    }
}

output {
    stdout {
            codec => "rubydebug"
    }
}
于 2014-09-02T09:49:19.583 回答