Every log call carried a context array, the log format rendered it as a string, and the aggregator indexed it as one blob.
$logger->warning('Payment declined', [
'order_id' => $order->id,
'gateway' => $gateway->name(),
'code' => $response->code(),
]);
// what reached the aggregator
[2023-10-26 09:14:02] app.WARNING: Payment declined
{"order_id":8814,"gateway":"stripe","code":"do_not_honor"}
// searchable as text. not filterable by code.
The context array is the useful part of PSR-3 and it only becomes useful when the formatter emits structured output and the aggregator parses it — otherwise it is a slightly tidier way of concatenating a string. Switching the handler to a JSON formatter took ten minutes; agreeing which keys are standard across the application took considerably longer and was the part that made queries possible.