Our solution
Structured logs with the right fields
Default fields cover the request basics. Custom context fields add the GraphQL details that matter: operation, timing, errors. Custom expression and header fields attach the business context that matters to you.
Per-request logging, end to end
Access logs are emitted by the router for every request.
Default fields cover the basics: hostname, pid, request_id, trace_id, status, method, path, query, ip (redacted), user_agent, config_version, latency, and log_type.
Custom context fields add GraphQL-aware data: operation_name, operation_type, operation_hash, per-stage timing (parsing, planning, normalization, validation), error codes, and error service names.
Custom fields are populated from request headers or template expressions, so you can attach tenant IDs, client identifiers, or any business context.
Output goes to stdout for container deployments, or to a file for high-load scenarios.
Every line is structured JSON, ready for ingestion by ELK, Splunk, or any aggregator.
One config block. Every line ready for ingestion.

