Standardised JSON logging for RFD services
Project description
rfd-logging
Standardised JSON logging for RFD services. One line per entry, machine-parseable, zero dependencies.
Installation
From PyPI:
pip install rfd-logging
Editable local install (for RFD services):
uv add --editable C:\Github\RFD_Logging
Usage
from rfd_logging import get_logger
logger = get_logger("rfd-collectors", log_dir="logs")
# Basic info
logger.info("Service started")
# With extra fields
logger.info("Request received", extra={"endpoint": "/api/data", "request_id": "req-abc123"})
# Error with description
logger.error("Database unreachable", extra={"error": "Connection refused", "host": "db.local"})
# Exception with traceback
try:
1 / 0
except ZeroDivisionError:
logger.exception("Unhandled error during processing")
Sample JSON output
{"timestamp": "2026-06-21T20:38:33.092Z", "level": "INFO", "service": "rfd-collectors", "message": "Request received", "extra": {"endpoint": "/api/data"}, "request_id": "req-abc123"}
{"timestamp": "2026-06-21T20:38:33.105Z", "level": "ERROR", "service": "rfd-collectors", "message": "Database unreachable", "extra": {"host": "db.local"}, "request_id": null, "error": "Connection refused"}
{"timestamp": "2026-06-21T20:38:33.110Z", "level": "ERROR", "service": "rfd-collectors", "message": "Unhandled error during processing", "extra": {}, "request_id": null, "traceback": "Traceback (most recent call last):\n ..."}
Output fields
| Field | Always present | Description |
|---|---|---|
timestamp |
✓ | ISO 8601 UTC with milliseconds — 2026-06-21T20:38:33.092Z |
level |
✓ | DEBUG | INFO | WARNING | ERROR | CRITICAL |
service |
✓ | Service name passed to get_logger |
message |
✓ | Rendered log message |
extra |
✓ | Dict of caller-supplied extra fields (empty dict if none) |
request_id |
✓ | Gateway trace ID — null if not set |
error |
Conditional | String error description when extra={"error": ...} is passed |
traceback |
Conditional | Exception traceback when exc_info is set (e.g. via logger.exception) |
Configuration
Log level
Set via environment variable before starting the service:
set RFD_LOG_LEVEL=DEBUG # Windows
export RFD_LOG_LEVEL=DEBUG # Linux/macOS
Default: INFO. Valid values: DEBUG, INFO, WARNING, ERROR, CRITICAL.
The variable is read at the time get_logger is first called for a given service — not at import time.
Log file location and rotation
get_logger(service, log_dir) writes to {log_dir}/service.log.
- Default
log_dir:./logsrelative to the working directory - Rotation: 10 MB per file, 5 backups kept (
service.log,service.log.1…service.log.5) - Encoding: UTF-8
- Also emits to stdout for NSSM
AppStdoutcapture
The log_dir is created automatically (including parents) if it does not exist.
Idempotent logger creation
get_logger is safe to call multiple times with the same service name — subsequent calls return the cached logger without adding duplicate handlers:
logger_a = get_logger("my-service", log_dir="logs")
logger_b = get_logger("my-service", log_dir="logs")
assert logger_a is logger_b # True
Zero dependencies
rfd-logging uses only the Python standard library: logging, json, datetime, pathlib, os. No third-party packages are installed.
Requirements
- Python ≥ 3.11
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rfd_logging-0.1.0.tar.gz.
File metadata
- Download URL: rfd_logging-0.1.0.tar.gz
- Upload date:
- Size: 7.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
202b771568da4253cd9f8eb90a2924fac7d867309408e69a24b9b725d7a18bed
|
|
| MD5 |
cce2cfbab0aec0f394710e8cee39abdc
|
|
| BLAKE2b-256 |
eb094e99abc01fa4c696f0745b1d464f944a1cda620bdf8afa50f6ce01c35ac1
|
File details
Details for the file rfd_logging-0.1.0-py3-none-any.whl.
File metadata
- Download URL: rfd_logging-0.1.0-py3-none-any.whl
- Upload date:
- Size: 6.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07f6dd7c6082c71e80099a2253ccb4456076c471741ac832b6c85c82a958b963
|
|
| MD5 |
085066d2114511c8632195d414bdc836
|
|
| BLAKE2b-256 |
b15beda7b3695a438379e8a62902c4bb0e059aee7136ee6ef63dbc1e82442222
|