繁体   English   中英

PHP 独白消息的上下文进入 ELK

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM