每个功能或每个模块的Python记录器

cos*_*ouc 6 python logging

我正在尝试开始使用python登录,并且已经阅读了多个博客。对我造成困扰的一个问题是是按功能还是按模块创建记录器。在本博客: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')
Run Code Online (Sandbox Code Playgroud)

给出的理由是

logging.fileConfig和logging.dictConfig默认情况下禁用现有的记录器。因此,文件中的那些设置将不会应用于您的记录器。最好在需要时获取记录器。创建或获取记录器很便宜。

推荐的阅读方式如下所示。该博客指出了这种方法"looks harmless, but actually, there is a pitfall"

import logging
logger = logging.getLogger(__name__)

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

class Bar(object):
    def bar(self):
        logger.info('Hi, bar')
Run Code Online (Sandbox Code Playgroud)

我发现前一种方法很繁琐,因为我必须记住要在每个函数中使用记录器。另外,使记录器具有每个功能肯定比每个模块一次昂贵。博客的作者提倡非问题吗?遵循日志记录最佳做法是否可以避免此问题?

ran*_*mir 7

我会同意你的看法。至少可以说,在您使用的每个功能中使用记录器都会造成不必要的认知开销。

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

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

为了避免记录器的过早(隐含的)建立与第一调用任何的消息记录功能发生(如logging.info()logging.error()等),如果根记录没有被预先配置,只需确保您登录之前配置您的记录

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

Python的日志记录教程(基础高级)可以为您提供参考,但是要获得更简洁的概述,请参阅《 Hitchhiker的Python指南》日志记录部分

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

看一下Python的日志记录教程中的修改后的示例

# 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()
Run Code Online (Sandbox Code Playgroud)

# mylib.py
import logging

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

def something():
    logger.info("something")
Run Code Online (Sandbox Code Playgroud)

产生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
Run Code Online (Sandbox Code Playgroud)

  • 被低估的答案。 (2认同)