Skip to main content

Logging (Loki)

Purpose: For platform engineers, shows how to configure Loki storage backends, retention policies, and log pipeline.

Task Summary​

Loki aggregates logs from all pods in the cluster. Promtail (deployed as a DaemonSet) tails container log files and ships them to Loki with Kubernetes labels attached. This guide covers log querying, retention configuration, and storage backend options.

Prerequisites​

  • Loki deployed via kube-prometheus-stack or standalone HelmRelease
  • Grafana configured with Loki as a data source (default in openCenter)
  • kubectl access to the cluster

Query Logs with LogQL​

Access Grafana's Explore view and select the Loki data source. LogQL queries filter by labels and optionally parse log content.

Filter by namespace and pod​

{namespace="my-app", pod=~"my-app-.*"}

Filter by log level​

{namespace="my-app"} |= "error"

Parse JSON logs and filter by field​

{namespace="my-app"} | json | level="error" | status_code >= 500

Count errors over time​

count_over_time({namespace="my-app"} |= "error" [5m])

Rate of log lines per second​

rate({namespace="my-app"}[1m])

Retention Configuration​

Retention controls how long logs are stored before deletion. Configure in the Loki HelmRelease values:

# applications/overlays/<cluster>/services/loki/override-values.yaml
loki:
limits_config:
retention_period: 720h # 30 days
compactor:
retention_enabled: true
retention_delete_delay: 2h
retention_delete_worker_count: 150

Retention is enforced by the compactor, which runs periodically and deletes chunks older than retention_period.

Storage Backends​

Loki supports multiple storage backends for chunks and index:

BackendUse CaseConfiguration Key
FilesystemDevelopment, single-nodestorage_config.filesystem
S3 / MinIOProduction, multi-nodestorage_config.aws
OpenStack SwiftOpenStack environmentsstorage_config.swift

Example S3/MinIO configuration:

loki:
storage_config:
aws:
s3: s3://access_key:secret_key@endpoint/bucket_name
s3forcepathstyle: true
boltdb_shipper:
active_index_directory: /data/loki/boltdb-shipper-active
cache_location: /data/loki/boltdb-shipper-cache
shared_store: s3

For Longhorn-backed storage (default in openCenter), the filesystem backend with a PVC is sufficient for most clusters.

Verification​

# Check Loki pods are running
kubectl get pods -n monitoring -l app.kubernetes.io/name=loki

# Check Promtail is running on all nodes
kubectl get pods -n monitoring -l app.kubernetes.io/name=promtail -o wide

# Verify logs are flowing — query via Grafana Explore or:
kubectl port-forward svc/loki -n monitoring 3100:3100
curl -s "http://localhost:3100/loki/api/v1/labels" | jq .

Troubleshooting​

No logs appearing in Grafana: Check Promtail pods are running and not in CrashLoopBackOff. Verify Promtail can reach Loki:

kubectl logs -n monitoring -l app.kubernetes.io/name=promtail --tail=20

"too many outstanding requests" error: Loki is overloaded. Increase limits_config.max_query_parallelism or add Loki replicas.

High storage usage: Enable retention (see above) and verify the compactor is running. Check with:

kubectl logs -n monitoring -l app.kubernetes.io/component=compactor --tail=20

Further Reading​