我认为使用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
的调用)但是只需要一行代替更多代码就更好了
答案 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')