gpt4 book ai didi

每个函数或每个模块的 Python 记录器

转载 作者:太空狗 更新时间:2023-10-29 23:57:17 28 4
gpt4 key购买 nike

我正在尝试开始在 python 中使用日志记录并阅读了几篇博客。一个让我感到困惑的问题是是按功能还是按模块创建记录器。在这个Blog: Good logging practice in Python建议为每个函数获取一个记录器。例如:

import logging

def foo():
logger = logging.getLogger(__name__)
logger.info('Hi, foo')

class Bar(object):
def __init__(self, logger=None):
self.logger = logger or logging.getLogger(__name__)

def bar(self):
self.logger.info('Hi, bar')

给出的推理是

The logging.fileConfig and logging.dictConfig disables existing loggers by default. So, those setting in file will not be applied to your logger. It’s better to get the logger when you need it. It’s cheap to create or get a logger.

我在其他地方阅读的推荐方式如下所示。该博客指出这种方法“看起来无害,但实际上有一个陷阱”

import logging
logger = logging.getLogger(__name__)

def foo():
logger.info('Hi, foo')

class Bar(object):
def bar(self):
logger.info('Hi, bar')

我发现前一种方法很乏味,因为我必须记住在每个函数中获取记录器。此外,在每个函数中获取记录器肯定比每个模块一次更昂贵。博客的作者是否提倡非问题?遵循日志记录最佳做法是否可以避免此问题?

最佳答案

我同意你的看法;至少可以说,在您使用的每个功能中获取记录器会产生太多不必要的认知开销。

博客作者的观点是正确的,您应该在使用记录器之前小心地正确初始化(配置)它们。

但他建议的方法只有在您无法控制应用程序加载和应用程序入口点(您通常会这样做)的情况下才有意义。

避免过早(隐式)创建记录器 that happens with a first call to any of the message logging functions (如 logging.info()logging.error() 等)如果事先没有配置根记录器,只需确保配置记录之前的记录器

Python docs 中还建议在启动其他线程之前从主线程初始化记录器.

Python 的日志记录教程(basicadvanced)可以作为引用,但为了更简洁的概述,请查看 logging section of The Hitchhiker's Guide to Python .

从多个模块记录日志的简单蓝图

看看这个修改过的example from Python's logging tutorial :

# myapp.py
import logging
import mylib

# get the fully-qualified logger (here: `root.__main__`)
logger = logging.getLogger(__name__)

def main():
logging.basicConfig(format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
level=logging.DEBUG)
# note the `logger` from above is now properly configured
logger.debug("started")
mylib.something()

if __name__ == "__main__":
main()

# mylib.py
import logging

# get the fully-qualified logger (here: `root.mylib`)
logger = logging.getLogger(__name__)

def something():
logger.info("something")

stdout 上生成(注意正确的 name):

$ python myapp.py
2017-07-12 21:15:53,334 __main__ DEBUG started
2017-07-12 21:15:53,334 mylib INFO something

关于每个函数或每个模块的 Python 记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45063099/

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