Chapter 8. About vLLM uvicorn access logs in distributed inference
You can control vLLM uvicorn access log behavior to balance operational visibility with infrastructure capacity. When you enable access logs for all endpoints, the Endpoint Picker (EPP) scheduler generates a high volume of logs. This log volume can overwhelm the OpenShift web console log viewer and consume significant storage in log aggregation infrastructure.
In Red Hat OpenShift AI 3.5, the default LLMInferenceServiceConfig template uses the --disable-access-log-for-endpoints flag to filter specific endpoint paths. By default, the following endpoints are filtered from access logs:
-
/health- Kubernetes liveness and readiness probes -
/metrics- Prometheus metrics scraping -
/ping- Basic connectivity checks
All other endpoints remain visible in access logs, including:
-
/v1/completions- Text completion requests -
/v1/chat/completions- Chat completion requests - Custom inference endpoints specific to your deployment
This targeted filtering approach restores visibility into inference request traffic while maintaining suppression of noisy health check and metrics endpoints.
Version-specific behavior
The logging behavior differs based on the vLLM version deployed:
- vLLM 0.16 or later
-
Uses targeted endpoint filtering with
--disable-access-log-for-endpoints /health,/metrics,/ping. By default, Uvicorn shows inference request logs and suppresses health check logs. - vLLM versions below 0.16
-
For vLLM versions below 0.16, the platform template reverts to the blanket
--disable-uvicorn-access-logflag. This behavior disables all uvicorn access logs, including inference requests.
The version detection and fallback mechanism operates automatically without requiring manual configuration changes. Existing deployments that use pre-0.16 vLLM images continue to function with their original blanket suppression behavior after upgrading to Red Hat OpenShift AI 3.5.
When to customize endpoint filtering
The default filtered endpoint list balances operational visibility with log volume for most deployments. You might need to customize the filtered endpoint list in the following scenarios:
-
Your deployment includes custom health check endpoints beyond the standard
/health,/metrics, and/pingpaths - You want to filter additional endpoints that generate high-frequency traffic specific to your application
- You need to temporarily see health check logs for debugging infrastructure issues
- You want to reduce the filtered list to see logs for specific endpoints that are currently suppressed
When to enable all access logs
You might need to enable access logs for all vLLM endpoints, including health checks and metrics, in the following scenarios:
- Debugging Kubernetes probe failures that require visibility into health check request patterns
- Troubleshooting metrics scraping issues that prevent monitoring from functioning correctly
- Investigating unexpected pod restart behavior that might be related to probe configuration
- Analyzing complete request patterns during active troubleshooting sessions
8.1. Configuring targeted vLLM endpoint log filtering Copy linkLink copied to clipboard!
You can customize the list of endpoints filtered from vLLM access logs to balance log volume with observability needs. By default, Red Hat OpenShift AI 3.5 filters /health, /metrics, and /ping endpoints while logging all other requests. You can override this default by specifying your own endpoint list in the LLMInferenceService custom resource. Your custom list replaces the default entirely, so include all endpoints you want filtered.
The --disable-access-log-for-endpoints flag uses exact path matching: /metrics matches /metrics but not /metrics/prometheus. Use a comma-separated list for multiple endpoints with no spaces (for example, /health,/metrics,/ping).
Prerequisites
- You have vLLM version 0.16 or later installed
- You have installed Red Hat OpenShift AI 3.5 or later
-
You have a running
LLMInferenceServicedeployment - You have access to the OpenShift CLI (`oc`) or the OpenShift web console
Procedure
Edit your
LLMInferenceServicecustom resource:$ oc edit llminferenceservice <service_name> -n <namespace>Replace
<service_name>with the name of yourLLMInferenceServiceand<namespace>with the namespace where theLLMInferenceServiceis deployed.-
In the editor, navigate to the
spec.template.containerssection. -
Locate the container named
main. Add the
--disable-access-log-for-endpointsflag to theargslist with your custom endpoint list:NoteThe default filtering behavior is applied automatically by the platform template and does not appear in the
LLMInferenceServicecustom resource. When you add the flag to yourargslist, your custom list overrides the platform default.To use the same endpoint list as the platform default (filtering health checks and metrics):
apiVersion: serving.kserve.io/v1alpha2 kind: LLMInferenceService metadata: name: my-vllm-service namespace: <namespace> spec: replicas: 2 model: uri: hf://RedHatAI/Qwen3-8B-FP8-dynamic name: RedHatAI/Qwen3-8B-FP8-dynamic router: route: {} gateway: {} scheduler: {} template: containers: - name: main args: - --disable-access-log-for-endpoints=/health,/metrics,/ping - --max-model-len=10000 - --gpu-memory-utilization=0.9To filter additional endpoints such as
/readyzand/livez, include them in your custom list along with the default endpoints:... containers: - name: main args: - --disable-access-log-for-endpoints=/health,/metrics,/ping,/readyz,/livez - --max-model-len=10000 - --gpu-memory-utilization=0.9 ...To reduce filtering and see logs for the
/pingendpoint, specify only the endpoints you want filtered:... containers: - name: main args: - --disable-access-log-for-endpoints=/health,/metrics - --max-model-len=10000 - --gpu-memory-utilization=0.9 ...Save and close the editor.
The
LLMInferenceServicecontroller automatically applies the updated configuration and restarts the affected pods.
Verification
Verify that the
LLMInferenceServiceis running:$ oc get llminferenceservice <service_name> -n <namespace>The output shows the service status:
NAME READY AGE my-vllm-service True 5mView the pod logs to confirm that health check and metrics requests are not logged:
$ oc logs <pod_name> -n <namespace> | grep "/metrics"Replace
<pod_name>with the name of one of the vLLM pods.The output should be empty, confirming that
/metricsrequests are filtered.-
Make a test inference request to the
/v1/completionsendpoint. View the pod logs again to verify that the inference request was logged:
$ oc logs <pod-name> -n <namespace> | grep "/v1/completions"The output shows the inference request:
INFO: 172.30.45.2:54325 - "POST /v1/completions HTTP/1.1" 200 OKThe IP addresses shown are internal pod network addresses and will vary by deployment.
- Confirm that only actual API usage is logged while health checks are filtered.
8.2. Enable vLLM uvicorn access logs Copy linkLink copied to clipboard!
You can enable vLLM uvicorn access logs for all endpoints, including health checks and metrics, to debug infrastructure issues and troubleshoot Kubernetes probe behavior. Inference request logs are visible by default through targeted endpoint filtering. This procedure demonstrates how you can enable the additional health check and metrics logs that are suppressed by default.
For vLLM 0.16 or later, the platform template applies targeted filtering with the --disable-access-log-for-endpoints flag. For vLLM versions below 0.16, the platform template reverts to blanket suppression with the --disable-uvicorn-access-log flag.
Prerequisites
- You have installed the OpenShift CLI (`oc`).
-
You have logged in as a user with
cluster-adminprivileges. -
You have deployed an
LLMInferenceServicecustom resource. - You know which vLLM version your deployment uses.
Procedure
Determine which vLLM version your deployment uses.
TipThe vLLM version is displayed in the pod startup logs as follows:
[access-log-detect] vllm version='<version>' [access-log-detect] selected ACCESS_LOG_ARGS='<flags>'The version is also shown as a label in the OpenShift AI under the Deployment resource.
For vLLM 0.16 or later, add the
--disable-access-log-for-endpointsflag with an empty value:Edit the
LLMInferenceServicecustom resource:$ oc edit llminferenceservice <service_name> -n <namespace>-
In the editor, navigate to
spec.template.containersand find the container namedmain. Add the
--disable-access-log-for-endpoints=flag with an empty value to theargslist:spec: template: containers: - name: main args: - --disable-access-log-for-endpoints= - --max-model-len=10000 - --gpu-memory-utilization=0.9The empty value disables endpoint filtering entirely, causing all endpoints to be logged.
Save and close the editor.
The
LLMInferenceServicecontroller automatically applies the updated configuration and restarts the affected pods.
For vLLM versions below 0.16, add the
--no-disable-uvicorn-access-logflag:NoteThis applies only to deployments using custom vLLM images below version 0.16. All shipped Red Hat OpenShift AI 3.5 images use vLLM 0.19.1 or later.
Edit the
LLMInferenceServicecustom resource:$ oc edit llminferenceservice <service_name> -n <namespace>-
In the editor, navigate to
spec.template.containersand find the container namedmain. Add the
--no-disable-uvicorn-access-logflag to theargslist:spec: template: containers: - name: main args: - --no-disable-uvicorn-access-log - --max-model-len=10000 - --gpu-memory-utilization=0.9Save and close the editor.
The
LLMInferenceServicecontroller automatically applies the updated configuration and restarts the affected pods.
Verification
Verify that the
LLMInferenceServiceis running:$ oc get llminferenceservice <service_name> -n <namespace>The output shows the service status:
NAME READY AGE my-vllm-service True 5mView the pod logs to confirm that health check and metrics access log entries appear:
$ oc logs <pod_name> -n <namespace> | grep -E "/(health|metrics|ping)"Replace
<pod_name>with the name of one of the vLLM pods.The output shows HTTP access log entries for health checks and metrics:
INFO: 172.30.45.2:54321 - "GET /metrics HTTP/1.1" 200 OK INFO: 172.30.45.2:54322 - "GET /health HTTP/1.1" 200 OK INFO: 172.30.45.2:54323 - "GET /ping HTTP/1.1" 200 OKThe IP addresses shown are internal pod network addresses and will vary by deployment.
Verify that inference request logs also appear:
$ oc logs <pod_name> -n <namespace> | grep "/v1/completions"The output shows inference request access log entries:
INFO: 172.30.45.2:54324 - "POST /v1/completions HTTP/1.1" 200 OK- Confirm that all endpoint types are now logged.
8.3. Example usage for Distributed Inference with llm-d Copy linkLink copied to clipboard!
These examples show how to use Distributed Inference with llm-d in common scenarios.
8.3.1. Single-node GPU deployment Copy linkLink copied to clipboard!
Use single-GPU-per-replica deployment patterns for development, testing, or production deployments of smaller models, such as 7-billion-parameter models.
For examples using single-node GPU deployments, see Single-Node GPU Deployment Examples.
8.3.2. Multi-node deployment Copy linkLink copied to clipboard!
For examples using multi-node deployments, see DeepSeek-R1 Multi-Node Deployment Examples.
8.3.3. Intelligent inference scheduler with KV cache routing Copy linkLink copied to clipboard!
You can configure the scheduler to track key-value (KV) cache blocks across inference endpoints and route requests to the endpoint with the highest cache hit rate. This configuration improves throughput and reduces latency by maximizing cache reuse.
For an example, see Precise Prefix KV Cache Routing.