如何使Logstash使用自己的日志

时间:2014-09-02 09:03:04

标签: logstash logstash-grok

基本上,我希望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
}

2 个答案:

答案 0 :(得分: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转换为数组并将提取的消息添加到数组中,因此将其捕获为不同的名称,然后替换消息。

答案 1 :(得分: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"
    }
}