向每个日志语句添加一个字符串

问题描述 投票:2回答:1

从REST请求中,我将获得一个需要添加到所有日志语句的ID。

我知道一种方法是将字符串添加到每个log语句中,如下所示

logging.info('{} References invoked {}'.format(_id, refs))

但是,想知道是否有任何简便的方法可以将_id烘焙到每个log语句中。

python-3.x logging
1个回答
0
投票

在Real python的一个好朋友的帮助下,我得以解决了这个问题。

import sys
import logging


def get_id_logger():
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s - '
                                  '%(levelname)-8s - '
                                  '[%(filename)s:%(lineno)d] - '
                                  '{_id} - '
                                  '%(message)s '.
                                  format(_id=locals().get('_id', '')))
    handler = logging.StreamHandler(sys.stdout)
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    return logger


def set_logger_id(logger, _id):
    logger_format = '%(asctime)s - ' \
                     '%(levelname)-8s - ' \
                     '[%(filename)s:%(lineno)d] - ' \
                     '{_id} - ' \
                    '%(message)s '.\
                    format(_id=locals().get('_id', ''))
    new_formatter = logging.Formatter(logger_format)
    handlers = logger.handlers
    for h in handlers:
        h.setFormatter(new_formatter)

test_script.py:

from logger import get_id_logger, set_logger_id

logger = get_id_logger()
logger.debug('Lets test something without req_id')


req_id = 9870
set_logger_id(logger, req_id)

logger.info('Lets test something with req_id')
logger.info('Lets test something with req_id again')
logger.info('Lets test something with req_id again')

req_id = 3456
set_logger_id(logger, req_id)
logger.info('Lets test something with req_id again')
logger.debug('Lets test something with req_id again')
© www.soinside.com 2019 - 2024. All rights reserved.