我的 Web 服务器 API 日志如下:
started
started
succeeded
failed
这是同时收到的两个请求。很难说谁成功了,谁失败了。为了将请求彼此分开,我为每个请求创建了一个随机数并将其用作记录器的名称
logger = logging.getLogger(random_number)
日志变成了
[111] started
[222] started
[111] succeeded
[222] failed
现在看起来很清楚,但这种方法的问题是我必须将记录器传递给每个相关的类,如下所示:
def __init__(self, logger):
self._logger = logger
所以问题是:
- 这是记录每个请求上下文的最佳方式吗?
- 如果是这样,传递记录器是个好主意吗?有什么办法可以让代码不那么冗长吗?
最佳答案
您不应为每个请求生成新的记录器。您应该识别请求的唯一属性(客户端 IP、URL、 session ID、一些 cookie token ...)并将其添加到日志语句中。这样您就可以在日志输出中链接单个请求的不同日志条目。
此外,日志不应该被传递。应使用 logging.getLogger(name)
中的属性 name
从代码中的不同位置获取相同的记录器。
最好更详细地阅读日志记录,例如在这里https://docs.python.org/3/library/logging.html您可以在其中找到一个有用的客户端 IP 示例:
FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logger = logging.getLogger('tcpserver')
logger.warning('Protocol problem: %s', 'connection reset', extra=d)
关于Python:传递记录器是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55791974/