Centralised logs from four services are four streams in one place until something ties a single request together across them. That something has to be generated at the edge and passed on every hop.
// middleware, at the first thing that touches the request
$id = $request->header('X-Request-Id') ?: bin2hex(random_bytes(8));
Log::withContext(['request_id' => $id]);
// and on every outbound call
$client->request('POST', $url, ['headers' => ['X-Request-Id' => $id]]);
Accepting an inbound header rather than always generating one is what lets a load balancer or a client supply it, and it is the difference between tracing a request from the browser and tracing it from your edge. Put it in the response header too — a support ticket that quotes the id turns a search through four hours of logs into one query.