Logging in the Apollo Router
The Apollo Router accepts a command-line argument to set its log level:
Name | Description |
---|---|
| The log level, indicating the most severe log message type to include. In ascending order of verbosity, can be one of: The default value is |
The router also accepts an APOLLO_ROUTER_LOG
environment variable with the same possible values as the command-line argument. If you provide both, the command-line argument takes precedence.
Output formats
The Apollo Router supports two logging formats:
- Basic logging, primarily for local development
- JSON-formatted logging, for compatibility with searchable logging tools like Google Cloud Logging
The router uses basic logging whenever an interactive shell session is attached, and it uses JSON-formatted logging otherwise (e.g., in CI and deployed environments). You can also enforce a specific format in configuration.
Basic logging via shell
Basic logging is mostly used during local development:
2022-03-18T10:28:11.090054Z INFO apollo_router::executable: apollo-router@0.1.0-alpha.92022-03-18T10:28:11.160650Z INFO apollo_router: Starting Apollo Router2022-03-18T10:28:11.339906Z INFO apollo_router: Listening on http://127.0.0.1:4000 🚀
JSON-formatted logging
JSON-formatted logging provides compatibility with common searchable logging tools like Google Cloud Logging. The Apollo Router uses the popular Bunyan format:
{"timestamp":"2022-03-18T11:46:41.926942Z","level":"INFO","fields":{"message":"apollo-router@0.1.0-alpha.9"},"target":"apollo_router::executable"}{"timestamp":"2022-03-18T11:46:41.985121Z","level":"INFO","fields":{"message":"Starting Apollo Router"},"target":"apollo_router"}{"timestamp":"2022-03-18T11:46:42.171173Z","level":"INFO","fields":{"message":"Listening on http://127.0.0.1:4000 🚀"},"target":"apollo_router"}{"timestamp":"2022-03-18T11:46:43.453993Z","level":"INFO","fields":{"message":"Stopped"},"target":"apollo_router"}
Basic configuration
This is part of an experimental feature, it means any time until it's stabilized (without the prefix experimental_
) we might change the configuration shape or adding/removing features.
If you want to give feedback or participate in that feature feel free to join this discussion on GitHub.
By default, the router doesn't log certain values that might contain sensitive data, even if a sufficient log level is set:
- Request bodies
- Response bodies
- Headers
You can enable selective logging of these values via the when_header
option:
telemetry:experimental_logging:format: json # By default it's "pretty" if you are in an interactive shell sessiondisplay_filename: true # Display filename where the log is coming from. Default: truedisplay_line_number: false # Display line number in the file where the log is coming from. Default: true# If one of these headers matches we will log supergraph and subgraphs requests/responseswhen_header:- name: apollo-router-log-requestvalue: my_clientheaders: true # default: falsebody: true # default: false# log request for all requests coming from Iphones- name: user-agentmatch: ^Mozilla/5.0 (iPhone*headers: true
Advanced configuration
For more granular control over Apollo Router logging, see the Env Logger documentation.