sinnwerkstatt/runrestic

Expose logging to user

darkdragon-001 opened this issue · 2 comments

I see you use logging library already. It would be nice, if the user could add additional logging.Formatter or logging.Handler (e.g. FileHandler with custom path and level, SMTPHandler).

Config file could consist of

  • import (or can this be determined based from handlerType automatically?)
  • handlerType, handlerArgs for constructor
  • level
  • format string

Library:

import logging

def getLevel(level):
    return getattr(logging, level.upper())
def getType(type):  # https://stackoverflow.com/a/452981/3779655
    parts = type.split('.')
    module = ".".join(parts[:-1])
    m = __import__(module)
    for comp in parts[1:]:
        m = getattr(m, comp)
    return m
# TODO allow variables for all handlerArgs/handlerKwargs of type str (configName, ...)
def addLoggerHandler(logger, handlerType, level=None, fmt=None, datefmt=None, *handlerArgs, **handlerKwargs):
    handler = getType(handlerType)(*handlerArgs,**handlerKwargs)
    if 'filename' in handlerKwargs:
        os.makedirs(handlerKwargs['filename'].rpartition('/')[2], exist_ok=True)
    if level is not None:
        handler.setLevel(getLevel(level))
    fmt_kwargs = {}
    if fmt is not None:
        fmt_kwargs['fmt'] = fmt
    if datefmt is not None:
        fmt_kwargs['datefmt'] = datefmt
    formatter = logging.Formatter(**fmt_kwargs)
    handler.setFormatter(formatter)
    logger.addHandler(handler)

An example call could be:

import logging
logger = logging.getLogger(__name__)

for _,handler in config['logger']['handlers'].items():
    addLoggerHandler(logger, **handler)

An example configuration could look like:

[logger.handlers.Default]
type = 'logging.StreamHandler'
level = 'info'
fmt = '%(message)s'

same here: just because code CAN be added, doesnt mean it has to, unless there's a good scenario to do so.