下面提供的解决方案......
我目前正在开发一个项目,该项目需要大量的活动记录才能供客户使用。
我去了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
。