| import logging |
| |
| from structuredlog import StructuredLogger, log_levels |
| |
| class UnstructuredHandler(logging.Handler): |
| def __init__(self, name=None, level=logging.NOTSET): |
| self.structured = StructuredLogger(name) |
| logging.Handler.__init__(self, level=level) |
| |
| def emit(self, record): |
| if record.levelname in log_levels: |
| log_func = getattr(self.structured, record.levelname.lower()) |
| else: |
| log_func = self.logger.debug |
| log_func(record.msg) |
| |
| def handle(self, record): |
| self.emit(record) |
| |
| class LoggingWrapper(object): |
| def __init__(self, wrapped): |
| self.wrapped = wrapped |
| self.wrapped.addHandler(UnstructuredHandler(self.wrapped.name, |
| logging.getLevelName(self.wrapped.level))) |
| |
| def add_handler(self, handler): |
| self.addHandler(handler) |
| |
| def remove_handler(self, handler): |
| self.removeHandler(handler) |
| |
| def __getattr__(self, name): |
| return getattr(self.wrapped, name) |
| |
| def std_logging_adapter(logger): |
| """Adapter for stdlib logging so that it produces structured |
| messages rather than standard logging messages |
| |
| :param logger: logging.Logger to wrap""" |
| return LoggingWrapper(logger) |