Python:传递记录器是个好主意吗?

标签 python logging

我的 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

所以问题是:

  1. 这是记录每个请求上下文的最佳方式吗?
  2. 如果是这样,传递记录器是个好主意吗?有什么办法可以让代码不那么冗长吗?

最佳答案

您不应为每个请求生成新的记录器。您应该识别请求的唯一属性(客户端 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/

相关文章:

Python 日志记录 : Inherit contextual information

go - Golang 包中的正确日志记录实现

python - 当出现[Errno 111]连接被拒绝时如何使用Python代理服务器

python - 如何在 pandas 数据框中选择特定值并将其替换为 NaN。如何从每个 1 级多索引中删除列

python - 如何过滤以下数据框?

android - 为什么我不应该在 android 中使用 System.out.println()

python - 在 python 中,如何确保使用记录器记录任何异常?

java - 将第三方库的 Log4j 日志路由到 Log4j2

python - 如何在 Mac 或 Linux 上安装 tensorflow 2.0?

具有可变字符数的 Python 负向后查找