как использовать адаптер ведения журналов для журналов sysout с использованием bunyan в python

Я пытаюсь добавить номер запроса в журнал для каждого запроса:

С модулем ведения журнала Python я смог использовать приведенную ниже команду, чтобы добавить идентификатор к каждому журналу:

id = uuid();
logger = logging.loggerAdapter(logging.getlogger('root'), {"RequestNumber" : id});

logger.info('this is a log message')

С ведением журнала Bunyan

import bunyan
import logging
import sys

logger = logging.getLogger()
#logger = logging.loggerAdapter(logging.getlogger('root'), {"RequestNumber" : id});
config = {
  'formatters': {
    'bunyan': {
      '()' : 'bunyan.BunyanFormatter'
    }
  },
  'handlers': {
    'debug': {
      'class': 'logging.StreamHandler',
      'formatter': 'bunyan',
      'stream': 'ext://sys.stdout'
    },
  },

  'root': {
    'level': 'DEBUG',
    'handlers': ['debug']
  },
  'version': 1
}

import logging.config
logging.config.dictConfig(config)

logger.debug("This is a log message")
logger.debug("This is a log message")
logger.debug("This is a log message")

Но в документации bunyan единственный способ добавить дополнительный словарь, как показано ниже:

logger.debug("This is a log message with extra context", extra = {'some': 'additional data'})

проблема в том, что RequestNumber должен быть добавлен в каждую команду журнала.

Есть ли способ использовать loggerAdapter с bunyan?


person MANOJ    schedule 21.12.2018    source источник


Ответы (1)


Если содержимое extra в основном или полностью останется статичным, вы можете использовать partial из functools. Например,

>>> from functools import partial
>>> logger.debug = partial(logger.debug, extra={"some_data":"right here"})
>>> logger.debug("test")
{"name": "root", "msg": "test", "some_data": "right here", "time": "2018-12-20T23:50:00Z", "hostname": "DESKTOP-DAQKYZ", "level": 20, "pid": 6840, "v": 0}
>>> logger.debug("danger, danger!")
{"name": "root", "msg": "danger, danger!", "some_data": "right here", "time": "2018-12-20T23:51:41Z", "hostname": "DESKTOP-DAQKYZ", "level": 20, "pid": 6840, "v": 0}
person Kevin S    schedule 21.12.2018
comment
для каждого запроса API содержимое дополнительных данных будет меняться. - person MANOJ; 21.12.2018
comment
Если он постоянно меняется, вам придется предоставить дополнительный аргумент, и никак иначе. Если он статичен или в основном статичен, вы можете использовать решение, которое я предоставил - person Kevin S; 21.12.2018