Python Logging Best Practices — Core Concepts
Why logging quality matters
When production incidents happen, logs are often the first and fastest diagnostic tool. Poor logs increase mean time to resolution because engineers cannot reconstruct events.
Use the standard logging module correctly
Configure central logging once, then use per-module loggers:
import logging
logger = logging.getLogger(__name__)
logger.info("order accepted", extra={"order_id": order_id})
Avoid scattered print() statements in production services.
Log levels as operational signals
Choose levels based on actionability:
DEBUG: detailed internals, usually disabled in productionINFO: important business and lifecycle eventsWARNING: degraded behavior with automatic recoveryERROR: failed operation requiring attentionCRITICAL: severe system-level failure
If everything is ERROR, nothing is.
Structured logging
Free-form strings are hard to query at scale. Structured logs (JSON fields) make filtering and dashboards easier.
Recommended fields:
- timestamp
- level
- service/component
- request_id or trace_id
- user/order/entity IDs when relevant
- error type
This structure enables fast searches like “all ERROR events for request_id X.”
Security and privacy guardrails
Never log:
- passwords
- bearer tokens
- full credit card numbers
- private health data
Use redaction filters for sensitive keys. Logging systems are often widely accessible internally; treat them as semi-public.
Message quality guidelines
Weak: "failed"
Strong: "payment_capture_failed", order_id=..., provider="stripe", retryable=True
Good logs describe event + context + next action implications.
Common misconception
“More logs are always better.” Excessive logs create noise, increase storage cost, and hide important signals. Prefer high-information logs at key boundaries.
Logging and debugging workflow
Pair logs with tools like Python Debugging with PDB for deep incident diagnosis. Logs tell where to look; debugger sessions reveal why state changed.
Team operations
Add logging review to code review checklist:
- does this path emit useful context?
- are log levels appropriate?
- any sensitive fields exposed?
Also maintain retention policies and sampling for high-volume events.
The one thing to remember: the best logs are concise, contextual, and safe to store.
Alert-aligned logging
Emit logs that map clearly to alert conditions. If on-call alerts trigger on payment failures, log a stable event name and essential identifiers so responders can pivot from alert to root cause quickly.
Review for readability under stress
Log lines should remain understandable at 3 AM during an outage. Prefer concise event names and consistent field ordering over clever prose.
Adoption playbook
A practical way to roll out logging best practices is to start with one critical workflow, set a measurable success signal, and review results after two weeks. Keep the first rollout intentionally small so the team learns the tool and failure modes without creating delivery risk. After the pilot is stable, document the standards in your engineering handbook and automate checks in CI. Small, repeated improvements usually beat dramatic one-time migrations.
See Also
- Python Alerting Patterns Alerting is a smoke detector for your code — it wakes you up when something is burning, not when someone is cooking.
- Python Correlation Ids Correlation IDs are name tags for requests — they let you follow one visitor's journey through a crowded theme park of services.
- Python Grafana Dashboards Python Grafana turns boring numbers from your Python app into colorful, real-time dashboards — like a car's dashboard but for your code.
- Python Log Aggregation Elk ELK collects scattered log files from all your services into one searchable place — like gathering every sticky note in the office into a single filing cabinet.
- Python Logging Handlers Think of logging handlers as mailboxes that decide where your app's messages end up — screen, file, or faraway server.