45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
"""
|
|
Structured logging helper for Netdata.
|
|
|
|
Netdata does not expose a generic "push a log line" API reachable with
|
|
just a room token from outside an Agent (see credentials.py). Until a
|
|
real push mechanism (StatsD or an OpenTelemetry log receiver) is
|
|
confirmed enabled on the agent, the supported path is the standard one:
|
|
emit structured JSON lines to stdout, which Netdata's log collectors
|
|
(systemd-journal / generic log source) are built to tail and parse.
|
|
"""
|
|
import logging
|
|
import sys
|
|
|
|
from pythonjsonlogger import jsonlogger
|
|
|
|
from .credentials import netdata
|
|
|
|
_LOGGER_NAME = "netdata"
|
|
|
|
|
|
def get_netdata_logger() -> logging.Logger:
|
|
logger = logging.getLogger(_LOGGER_NAME)
|
|
|
|
if not logger.handlers:
|
|
handler = logging.StreamHandler(stream=sys.stdout)
|
|
handler.setFormatter(
|
|
jsonlogger.JsonFormatter("%(asctime)s %(levelname)s %(name)s %(message)s")
|
|
)
|
|
logger.addHandler(handler)
|
|
logger.setLevel(logging.INFO)
|
|
logger.propagate = False
|
|
|
|
return logger
|
|
|
|
|
|
def log_event(message, level="info", **fields):
|
|
"""Log a structured event intended to be picked up by Netdata.
|
|
|
|
Extra keyword arguments are attached as structured fields on the JSON
|
|
log line, e.g. log_event("hello world", source="netdata_logging.hello").
|
|
"""
|
|
logger = get_netdata_logger()
|
|
log_fn = getattr(logger, level.lower(), logger.info)
|
|
log_fn(message, extra={"netdata_agent_host": netdata.agent_host, **fields})
|