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