【问题标题】:Logstash grok filter config for php monolog multi-line(stacktrace) logs用于 php monolog 多行(stacktrace)日志的 Logstash grok 过滤器配置
【发布时间】:2018-02-12 11:32:59
【问题描述】:
[2018-02-12 09:15:43] development.WARNING: home page  
[2018-02-12 09:15:43] development.INFO: home page  
[2018-02-12 10:22:50] development.WARNING: home page  
[2018-02-12 10:22:50] development.INFO: home page  
[2018-02-12 10:22:50] development.ERROR: Call to undefined function vie() {"exception":"[object](Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Call to undefined function vie() at /var/www/html/routes/web.php:16 
[stacktrace]
#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(198): Illuminate\\Routing\\Router->{closure}()
#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(172): Illuminate\\Routing\\Route->runCallable()
#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(658): Illuminate\\Routing\\Route->run()
#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))

.....
.....
.....

#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#47 /var/www/html/public/index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#48{main}
"}

以上是我的 Laravel 独白示例日志数据。我正在使用 Logstash 读取日志数据并将其发送到 Elasticsearch。下面是我的 logstash.conf 文件

input {
  file {
    path => '/var/www/html/php-app/application/storage/logs/laravel-*.log'
    start_position => 'beginning'
    ignore_older => 0
  }
}
filter {
  grok {
    match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:env}\.%{DATA:severity}: %{DATA:message}at %{DATA:trace}" }
  }
}
output {
  elasticsearch {
    hosts => [ 'localhost:9200' ]
    index => "laravel-%{+YYYY-MM-dd}"
  }
  stdout {
    codec => rubydebug
  }
}

以上配置适用于单行日志消息。例如下面的日志消息

[2018-02-12 09:15:43] development.WARNING: home page

将输出生成为

"timestamp": "2018-02-12 10:57:25",
"@timestamp": "2018-02-12T10:57:26.614Z",
"severity": "INFO",
"path": "/var/www/html/php-app/application/storage/logs/laravel-2018-02-12.log",
"message": "[2018-02-12 10:57:25] development.INFO: home page  ",
"env": "development"

但是对于多行消息(即带有堆栈跟踪的消息),它会为每一行生成如下所示。

"@timestamp" => 2018-02-12T10:56:47.785Z,
"path" => "/var/www/html/php-app/application/storage/logs/laravel-2018-02-12.log",
"message" => "#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\\\Foundation\\\\Http\\\\Middleware\\\\ValidatePostSize->handle(Object(Illuminate\\\\Http\\\\Request), Object(Closure))",
"tags" => [
    [0] "_grokparsefailure"
],

我也尝试过多行过滤器。多行错误日志仍然没有成功。我需要一个适合多行和单行错误消息的解决方案。

请帮助我找到适合单行和多行错误日志的正确 grok 配置。

【问题讨论】:

  • 你应该在你的输入上使用多行编解码器,配置如下:multiline { pattern => "\[[\d]{4}" negate => "true" what => "previous" }
  • @baudsp 你的建议对我不起作用。它仍然按行拆分日志。关于 grok 过滤器配置的任何想法。
  • 你的 grok 模式有问题:最后%{DATA:message}at %{DATA:trace} at 将在所有非例外的行上中断。
  • 您可以在 grok 过滤器中使用多个模式。这是一个可能的解决方案。见stackoverflow.com/a/28453382/6113627
  • 您可以使用(|at %{DATA:trace}),这使得at %{DATA} 是可选的。请注意,您可以测试您的 grok 模式here

标签: elasticsearch logstash elastic-stack logstash-grok logstash-configuration


【解决方案1】:

终于!我得到了我的问题的解决方案。并发布对其他人有用的 logstash 配置。

input {
    file {
        path => '/var/www/html/php-app/application/storage/logs/laravel-*.log'
        start_position => 'beginning'
        ignore_older => 0
        codec => multiline { pattern => "\[[\d]{4}" negate => "true" what => "previous" }
    }
}

filter {
    grok {
        match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:env}\.%{DATA:severity}: %{DATA:message}" }
    }
}

output {
    elasticsearch {
        hosts => [ 'localhost:9200' ]
        index => "laravel-%{+YYYY-MM-dd}"
    }
    stdout {
        codec => rubydebug
    }
}

@baudsp 感谢您帮助我解决这个问题。

【讨论】:

  • 对我来说,这个 grok 一直有效到 DATA.SEVERITY 部分。之后它什么也抓不到。
  • @Borjante 你能给我你正在处理的示例日志数据吗?
  • 好的。让我知道你有什么改变。
  • 这是我最终使用的 GROK:[%{TIMESTAMP_ISO8601:timestamp}] %{DATA:env}\.%{DATA:severity}: %{DATA:key} \{"message ":"%{DATA:message}?","code":%{DATA:code}?,"stacktrace":"%{DATA:stacktrace}?"
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多