在Python中调用getLogger之前,是否需要显式检查__name__ ==“__ main__”?

时间:2015-06-14 00:47:38

标签: python logging

我认为使用Python的内置日志记录模块使主模块中的logger成为根记录器是标准做法。假设这是正确的,在我看来,对于任何可能或可能不作为main运行的模块,我需要明确检查。原因是,如果我遵循调用logging.getLogger(__name__)的标准做法,我将获得一个名为__main__的记录器,而不是根记录器:

import logging
print logging.getLogger().name # root
print logging.getLogger(__name__).name # __main__

总是要检查最佳做法吗?

if __name__ == "__main__":
    logger = logging.getLogger()
else:
    logger = logging.getLogger(__name__)

这并不是很糟糕,因为我总是会有其他代码只在__name__ == "__main__"运行时(通常包括对logging.basicConfig的调用)但是只需要一行代替更多代码就更好了

2 个答案:

答案 0 :(得分:3)

是的 - 我相信这是一个好主意。因为 - 发生的事情如下 -

如果您正在以python prog.py运行程序 - (__name__将是__main__)并且您获得root记录器(预期)。或者你甚至可以给出一个你喜欢的名字(比如prog)。当你import那个模块时 - 名称就是模块的名称。 (在这种情况下没有扩展名的{python文件名prog),这将帮助您识别日志的来源 - 这是您想要的。所以一般来说这样做是个好主意。

答案 1 :(得分:1)

使用logging.getLogger(__name__)的做法适用于模块级记录器,如 advanced logging tutorial

在脚本(或应用程序的主模块)中,我通常根本不创建记录器,但我确实更改了根记录器的配置;

opts = argparse.ArgumentParser(prog='foo', description=__doc__)
group.add_argument('-v', '--version', action='version',
                   version=__version__)
opts.add_argument('--log', default='warning',
                  choices=['debug', 'info', 'warning', 'error'],
                  help="logging level (defaults to 'warning')")
opts.add_argument("files", metavar='file', nargs='*',
                  help="one or more files to process")
args = opts.parse_args(argv)
logging.basicConfig(level=getattr(logging, args.log.upper(), None),
                    format='%(levelname)s: %(message)s')
相关问题