1

下面提供的解决方案...

我目前正在开展一个项目,该项目需要大量可供客户使用的活动记录。

我去了ELK一堆。不用说,我把它全部设置好了,效果很好。

但是,如果我这样做Symfony2

$this->get('logger')
    ->info('Some fabulous message', ['payload' => $payload]);

... Logstash 创建一组前缀字段,@fields.ctxt_payload其中包含数据。例如:

`@fields.ctxt_payload.foo`
`@fields.ctxt_payload.foo.bar`
`@fields.ctxt_payload.foo.bar.meh`
`@fields.ctxt_payload.another`

问题:

我能做些什么来制作logstash/kibana保留原始json结构吗?

展平对象不会起到作用,因为有效负载有时会包含大量数据。

这也是我尝试过的:

$this->get('logger')
    ->info('Some fabulous message', ['payload' => json_encode($payload)]);

然后在logstash配置中:

input { 
    redis { 
        queue => "logstash"
        debug => true
    } 
}
filter{
    json {
        source => "payload"
        target => "parsed"
    }
}
output { 
    elasticsearch { 
        host => "localhost" 
        protocol => "http" 
    } 
}

但是由于某种原因logstash没有创建一个parsed字段。:-/

有什么建议吗?这甚至可能吗?

解决方案:

在架构上,我有以下数据流:

  • Monolog将数据推emran/logstash-bundle送到redis
  • logstashredis通过输入拾取
  • logstash通过解析字段json
  • logstash将数据推送到elastic

嗯,emran/logstash-bundle是罪魁祸首。@fields它正在使用前缀格式化数据。为了克服这个问题,我不得不改变数据流:

  • Monolog通过内置gelf处理程序推送数据
  • logstashgelf通过输入拾取
  • logstash通过解析字段json
  • logstash将数据推送到elastic

一旦我切换到gelf格式,以下将开始工作:

$this->get('logger')
    ->info('Some fabulous message', ['payload' => $payload]);

并且数据将被解析。

非常感谢 Alain Collins 的评论。如果不是因为他,我会花费数小时甚至数天来指责logstash

4

0 回答 0