Expose logging to user
darkdragon-001 opened this issue · 2 comments
darkdragon-001 commented
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 fromhandlerType
automatically?)handlerType
,handlerArgs
for constructorlevel
format
string
darkdragon-001 commented
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'
andreasnuesslein commented
same here: just because code CAN be added, doesnt mean it has to, unless there's a good scenario to do so.