从REST请求中,我将获得一个需要添加到所有日志语句的ID。
我知道一种方法是将字符串添加到每个log语句中,如下所示
logging.info('{} References invoked {}'.format(_id, refs))
但是,想知道是否有任何简便的方法可以将_id
烘焙到每个log语句中。
在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')