Можно ли ввести уровень журнала в структурированные данные в журнале python - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь записать несколько структурных журналов на стандартный вывод из моей программы python. В частности, я пытаюсь написать json, который соответствует следующему, чтобы при запуске в GCP он принимался драйвером стека и интерпретировался как структурированные данные:

https://cloud.google.com/run/docs/logging#run_manual_logging - python

Глядя на python документы, я мог бы создать класс для моих структурированных данных и обработать его до одной строки json string:

https://docs.python.org/2/howto/logging-cookbook.html#implementing -структурированное ведение журнала

Но на чем я застрял; как мне добавить уровень журнала к этим структурированным данным, не имея избыточных вызовов журнала просмотра:

class StructuredMessage(object):
def __init__(self, **kwargs):
    self.kwargs = kwargs

def __str__(self):
    return json.dumps(self.kwargs)

// Ideally I should have to type level='INFO' here, is there a way to get the logging
// module to do something to insert that information on the StructuredMessage instance?
logging.info(StructuredMessage(level='INFO'))

1 Ответ

1 голос
/ 13 июля 2020

Существует множество способов сделать это - можно использовать простую вспомогательную функцию, подобную этой (предполагается, что import logging уже выполнено):

def log_structured(logger, level, **kwargs):
    kwargs[level] = level
    # you could also inject the logger name into kwargs here ...
    # convert e.g. string 'INFO' to logging.INFO
    # assumes you only use the standard levels defined in logging
    level = getattr(logging, level)
    logger.log(level, StructuredMessage(**kwargs))

Функции, подобные logging.info(), используют root регистратор, чтобы вы могли сделать что-то вроде

root_logger = logging.getLogger()
log_structured(root_logger, 'INFO', foo='bar', bar='baz', num=123, fnum=123.456)
...