[英]Grokking context of PHP monolog message into ELK
我希望能够在 Kibana 中搜索我在 Monolog 中作为上下文记录的字段。
我的意思是,如果我$log->info("Request", $visitDetails);
其中$visitDetails
是一个数组,然后我希望 Logstash 为 Elastic 挖掘它,以便对数组键/值进行索引和搜索。
我的 PHP 看起来像这样:
// "logstash" is a host defined by docker-compose
$handler = new SocketHandler('logstash:9001', Logger::DEBUG);
$log->pushHandler($handler);
$log->pushHandler(new StreamHandler(__DIR__ . '/test.log', Logger::DEBUG));
// log the details of the user visit
$visitDetails = [
'ip' => $_SERVER['REMOTE_ADDR'],
'method' => $_SERVER['REQUEST_METHOD'],
'uri' => $_SERVER['REQUEST_URI'],
'agent' => $_SERVER['HTTP_USER_AGENT'],
'referer' => $_SERVER['HTTP_REFERER'] ?? 'not set'
];
$log->info("Request", $visitDetails);
我的 Logstash 配置如下所示:
input {
tcp {
port => 9001
}
}
filter {
grok {
match => { "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:env}\.%{DATA:severity}: %{GREEDYDATA:message} \{%{GREEDYDATA:context}\} \[\]" }
}
}
output {
stdout {}
}
我正在使用https://grokdebug.herokuapp.com/来帮助制定 grok 模式,现在可以将“上下文”隔离为 JSON 字符串。
如何创建一个过滤器,将其扩展为 Elastic 的键/值对?
我认为部分问题是 json 字符串周围的大括号{}
被拿走了。 我正在努力为他们建立一个非捕获组。
我宁愿使用 Grok 的正则表达式功能(由https://github.com/kkos/oniguruma/blob/master/doc/RE提供支持)。
这让我可以使用正则表达式,使用这种语法(?<field_name>the pattern here)
,然后我使用非捕获组作为左括号。
这似乎做了我想要的:
filter {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:env}\.%{DATA:severity}: %{GREEDYDATA:message} (?<context>(\{.*?\})) \[\]" }
}
}
filter {
json {
source => "context"
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.