gpt4 book ai didi

python - 在某些请求期间为 python 的记录器添加标识符的惯用方法?

转载 作者:太空宇宙 更新时间:2023-11-04 05:19:32 25 4
gpt4 key购买 nike

我有很多客户使用的服务器。为了更轻松地查找日志条目,我想让客户端为每个请求提供一个 UUID,然后在请求期间为每个日志消息添加该 UUID。这样做的好处是,如果客户遇到一些错误,他们可以将 ID 提供给我,我将能够在日志中快速找到它。我认为这是非常标准的;在 Python 中是否有任何惯用语来完成此任务?

我可以通过在每条日志消息前手动添加 uuid 来天真地做到这一点:

import uuid
import logging
logger = logging.getLogger(__name__)

def request(*args, **kwargs):
_id = args.get("_id", str(uuid.uuid4()))
logger.info("{} - {}".format(_id, "Starting request"))

我还可以为每个请求创建一个新的记录器,并更改 formatter 来为我处理前置:

import uuid
import logging

def build_logger(_id):
logger = logging.getLogger(_id)
# ...
formatter = logging.Formatter('%(name)s - %(message)s')
# ...
return logger

import uuid
def request(*args, **kwargs):
_id = args.get("_id", str(uuid.uuid4()))
logger = build_logger(_id)

然后我想我也许可以创建一个代理类,它会拦截对 infodebugexception 等的调用,并在前面加上 uuid。像这样的东西:

import uuid
import logging
logger = logging.getLogger(__name__)

class Logger(object):
"""Naive Proxy class for logger"""
def __init__(self, _id):
self._id = _id
def debug(self, msg):
logger.debug("{} - {}".format(self._id, msg)
def info(self, msg):
logger.info("{} - {}".format(self._id, msg)
# and etc. for each level and `exception`

def request(*args, **kwargs):
_id = args.get("_id", str(uuid.uuid4()))
logger = Logger(_id)

为什么不使用 __getattr__ 和装饰器来折叠它们呢?

import uuid
import logging
logger = logging.getLogger(__name__)

def loggerator(_id):
"""
Decorator to intercept `info`, `debug`, etc. and prepend the `_id`
Used in the Logger Proxy class
"""
def _loggerator(func):
def __loggerator(msg):
return func("{} - {}".format(_id, msg))
return __loggerator
return _loggerator

class Logger(object):
"""Proxy class for logger"""
def __init__(self, _id):
self._id = _id
def __getattr__(self, item):
if item == '_id':
return object.__getattribute__(self, item)
if item in ('debug', 'info', 'warn', 'warning', 'error', 'critical', 'fatal', 'exception'):
return loggerator(self._id)(getattr(logger, item))
return getattr(logger, item)

def request(*args, **kwargs):
_id = args.get("_id", str(uuid.uuid4()))
logger = Logger(_id)

最佳答案

如何执行此操作记录在 Logging Cookbook 中,它是 Python 文档的一部分。

关于python - 在某些请求期间为 python 的记录器添加标识符的惯用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40773798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com