Source code for locust_telemetry.logger
"""
This module provides structured JSON logging for Locust Telemetry.
Features
- Outputs logs in JSON format compatible with RFC3339 timestamps.
- Custom formatter for millisecond-precision timestamps in UTC.
- Configures loggers specifically for the `locust_telemetry` namespace.
- Provides a convenience function to apply the logging configuration.
"""
import logging
from datetime import datetime, timezone
from pythonjsonlogger.json import JsonFormatter
# -------------------------------
# Custom RFC3339 JSON Formatter
# -------------------------------
[docs]
class RFC3339JsonFormatter(JsonFormatter):
"""
Custom JSON formatter for RFC3339 timestamps.
This formatter ensures timestamps are:
- in ISO 8601 / RFC3339 format
- millisecond-precision
- in UTC (Z suffix)
"""
[docs]
def formatTime(self, record, datefmt=None) -> str:
"""
Format the log record timestamp in RFC3339 with milliseconds.
Args:
record (logging.LogRecord): Log record to format
datefmt (Optional[str]): Ignored; kept for compatibility
Returns:
str: ISO 8601 formatted timestamp
"""
dt = datetime.fromtimestamp(record.created, tz=timezone.utc)
return dt.isoformat(timespec="milliseconds").replace("+00:00", "Z")
# -------------------------------
# Logging Configuration
# -------------------------------
[docs]
def configure_logging(level: str = "INFO"):
"""
Apply the logging configuration to the Python logging system.
Parameters
----------
level : str
Log level for the telemetry logger (e.g. "DEBUG", "INFO", "WARNING").
"""
config = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"json": {
"()": RFC3339JsonFormatter,
"format": "%(asctime)s %(levelname)s %(name)s %(message)s",
"rename_fields": {"asctime": "time", "levelname": "level"},
"json_indent": None,
}
},
"handlers": {
"telemetry_console": {
"class": "logging.StreamHandler",
"formatter": "json",
"level": level.upper(),
},
"null": {
"class": "logging.NullHandler",
"level": level.upper(),
},
},
"loggers": {
"locust_telemetry": {
"handlers": ["telemetry_console"],
"level": level.upper(),
"propagate": False,
},
},
}
logging.config.dictConfig(config)