Как сделать пользовательский адаптер, созданный в основном, доступным для всех модулей - PullRequest
0 голосов
/ 08 января 2019

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

Я использую конфигурацию регистрации json и загружаю ее в основной класс

JSON config:

{
"version": 1,
"disable_existing_loggers": false,
"formatters": {
    "standard": {
        "format": "%(asctime)s [%(levelname)s] %(funcName)s: %(message)s"
    }
},
"handlers": {
    "console": {
        "level":"DEBUG",
        "class":"logging.StreamHandler",
        "formatter": "standard",
        "stream": "ext://sys.stdout"
    },
    "info_file": {
        "class": "logging.handlers.RotatingFileHandler",
        "level": "INFO",
        "formatter": "standard",
        "filename": "info.log",
        "maxBytes": 10485760,
        "backupCount": 15,
        "encoding": "utf8"
    },
    "error_file": {
        "class": "logging.handlers.RotatingFileHandler",
        "level": "ERROR",
        "formatter": "standard",
        "filename": "error.log",
        "maxBytes": 10485760,
        "backupCount": 20,
        "encoding": "utf8"
    }
},
"root": {
    "handlers": [ "info_file"],
    "level": "DEBUG"
}

}

основной класс:

if __name__ == "__main__":
      logger = logging.getLogger(__name__)

    with open(base_dir_path+'logging_conf.json', 'r') as logging_configuration_file:
    config_dict = json.load(logging_configuration_file)
logging.config.dictConfig(config_dict)

и создание CustomAdapter путем импорта из другого модуля

class CustomAdapter(logging.LoggerAdapter):
    def process(self, msg, kwargs):
        # use log_context from kwargs or the default given on instantiation
       log_context = kwargs.pop('log_context', self.extra['log_context'])
       return '[%s] %s' % (log_context, msg), kwargs

 log_id = '123'
 extra = {'log_context': log_id}
     logger = CustomAdapter(logger, extra)
     logger.info(log_id)

и для каждой функции в разных модулях я передаю идентификатор журнала и вызываю CustomAdapter

def somemethod(log_id)
   logger = logging.getLogger(__name__)
   logger = CustomAdapter(logger, extra= {'log_context': log_id})

вывод логгера:

2019-01-08 23:57:23,901 [INFO] check_for_last_run_in_job_control: [123] Executing query to check if last run is INPROGRESS

Выходные данные регистратора исключены:

  2019-01-08 23:57:23,901 [INFO] [123] check_for_last_run_in_job_control: Executing query to check if last run is INPROGRESS

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

  1. А также я ожидаю, что мой файл регистратора будет отображаться после INFO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...