Skip to main content

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: ./logs relative to the working directory
  • Rotation: 10 MB per file, 5 backups kept (service.log, service.log.1service.log.5)
  • Encoding: UTF-8
  • Also emits to stdout for NSSM AppStdout capture

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

rfd_logging-0.1.3.tar.gz (11.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rfd_logging-0.1.3-py3-none-any.whl (9.9 kB view details)

Uploaded Python 3

File details

Details for the file rfd_logging-0.1.3.tar.gz.

File metadata

  • Download URL: rfd_logging-0.1.3.tar.gz
  • Upload date:
  • Size: 11.2 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

Hashes for rfd_logging-0.1.3.tar.gz
Algorithm Hash digest
SHA256 176084a2cd6f927da459cf744bc3848fa331c0c81bbefb97eebaa039b3918465
MD5 ac9e5d3b99a6999ed5d6c743f2af5118
BLAKE2b-256 c73f6728b0a4e5d672fdb6309d67e8a7f3d984a803863792860e9cde929c3b75

See more details on using hashes here.

File details

Details for the file rfd_logging-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: rfd_logging-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 9.9 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

Hashes for rfd_logging-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 d2fcfd9b6057287cf18f00f881f2926a62425a140f8f3844737b4720123b2c7e
MD5 33d75d20144af3ff131f957d1dc50f68
BLAKE2b-256 0e09ce69278215c63e85fddd20b8a7a27609a1df3f1ef2829795da969fd833ef

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page