1

我们最近开始使用 logstash 收集所有 Java 服务器日志。

默认 log4j 配置工作正常,但对于异常和 sql 查询,我们使用:

http://logstash.net/docs/1.2.2/filters/multiline

filter {
 multiline {
  type => "somefiletype"
  pattern => "^\s"
  what => "previous"
 }
}

但这不能 100% 准确地工作,一些异常/SQL 没有所需的格式。

可以通过以下方式配置多行插件:

如果行的开头没有时间戳,它是多行日志消息?

4

2 回答 2

5

改用多行编解码器,文档甚至有一个针对这个确切问题的示例 http://logstash.net/docs/1.2.2/codecs/multiline

于 2013-11-08T19:27:14.387 回答
1

我终于成功地从我的日志文件中解析了多行日志消息。请注意,您的日志消息可能会略有不同,需要更改 grok 模式。主要修复是在 grok 过滤器之前放置多行过滤器,并在它和 grok 过滤器之间进行 drop{}。重要提示:使用Grok 调试器来调试您的 grok 过滤器。

input {
  stdin {
    type => "log4j"
  }
}

filter {
  if [type] == "log4j" {

    multiline {
      pattern => "^[\d]{4}\-[\d]{2}\-[\d]{2} "
      negate => true
      what => previous
    }
    if "_grokparsefailure" in [tags] {
      drop { }
    } 
    grok {
      match => {
      "message" =>  "(?<logdate>[\d]{4}\-[\d]{2}\-[\d]{2} [\d]{2}:[\d]{2}:[\d]{2},[\d]{3})%{SPACE}%{NUMBER:unknown1}%{SPACE}%{LOGLEVEL:severity}%{SPACE}\[(?<logger>[^\]]+)\]%{SPACE}\((?<thread>[^\)]+)\)%{SPACE}%{GREEDYDATA:message}"
      }
      overwrite => [ "message" ]
    }

    if !("_grokparsefailure" in [tags]) {
      date {
        match => [ "logdate", "YYYY-MM-dd HH:mm:ss,SSS"]
      }
    }
  }
}


output {   
  # Print each event to stdout.
  stdout {
    codec => json
  }
}
于 2015-08-25T16:27:59.903 回答