提供数组作为日志条目上下文

时间:2015-04-21 20:37:24

标签: symfony logstash kibana-4

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

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

我去了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
  • logstash通过redis输入
  • 选择
  • logstash通过json
  • 解析字段
  • logstash将数据推送到elastic

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

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

一旦我切换到gelf格式,以下内容就会开始工作:

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

数据将被解析。

非常感谢Alain Collins的评论。如果不是因为不适合他的话,我会花费几个小时甚至几天责备logstash

0 个答案:

没有答案