Python — ведение журнала из нескольких модулей с использованием structlog

Я пытаюсь использовать Structlog для записи в файл, а затем использую filebeat для отправки журнала в мою службу ведения журнала.

Я заставил все работать, но я хотел бы иметь возможность использовать один и тот же регистратор в нескольких модулях, например, с регистратором Python по умолчанию (см. https://docs.python.org/2/howto/logging.html раздел "Ведение журнала из нескольких модулей").

Одна из причин заключается в том, что я хотел бы привязать идентификатор сеанса к моему выходу журнала, который должен регистрироваться во всех модулях, вызываемых из этого сеанса.

Вероятно, нужны некоторые фундаментальные знания о том, как использовать structlogger, но я не нашел ответа в их документации или в других сообщениях.

Пожалуйста посоветуй....

Пример:

main.py

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import uuid

from mylogger import myLogger
import otherModule

myLogger = myLogger()

myLogger.log.warning('working', error='test')

myLogger.log = myLogger.log.bind(sessionID=str(uuid.uuid4()))

myLogger.log.warning('Event where sessionID is bound to logger', error='test')

otherModule = otherModule.otherModule()

myLogger.py

#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import datetime, logging
from structlog import wrap_logger, get_logger
from structlog.processors import JSONRenderer
from structlog.stdlib import filter_by_level, add_log_level


class myLogger():
    def __init__(self, loggername="root", logLevel='INFO', logFile='test2.log'):

        self.log = wrap_logger(
            logging.getLogger('root'),
            processors=[
                filter_by_level,
                add_log_level,
                self.add_timestamp,
                JSONRenderer(indent=1, sort_keys=True)
            ]
        )

        logging.basicConfig(format='%(message)s', level=logLevel, filename=logFile)

    def my_get_logger(self, loggername="AnyLogger"):
        log = get_logger(loggername)

        return log

    def add_timestamp(self,  _, __, event_dict):
        event_dict['timestamp'] = datetime.datetime.utcnow().isoformat()
        return event_dict

другоймодуль.py

import structlog
from mylogger import myLogger

class otherModule():
    def __init__(self):
        logger = structlog.get_logger('root')
        ## This logger does not have the processors nor the bound sessionID

        logger.warning('In other module')
        ## This logmessage is printed to console

        logger2 = myLogger();
        ## This logger has all the processors  but not the bund sessionID

        logger2.log.warning('In other module')
        ## This log is written to my logfile, but without the sessionID

person ppoulsen    schedule 08.10.2017    source источник


Ответы (1)