我相信使用Python的内置日志记录模块logger使主模块中的根记录器成为标准做法.假设这是正确的,在我看来,对于任何可能或可能不作为main运行的模块,我需要明确检查.原因是,如果我遵循标准的调用方法,logging.getLogger(__name__)我会得到一个名为logger __main__而不是根记录器:
import logging
print logging.getLogger().name # root
print logging.getLogger(__name__).name # __main__
Run Code Online (Sandbox Code Playgroud)
总是要检查最佳做法吗?
if __name__ == "__main__":
logger = logging.getLogger()
else:
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)
这并不是那么糟糕,因为我总是会有其他代码只运行if __name__ == "__main__"(通常包括调用logging.basicConfig),但是只需要一行而不是更多就很好.
使用的实践logging.getLogger(__name__)是针对模块级记录器的,如高级日志记录教程中所述
。
在脚本(或应用程序的主模块)中,我通常根本不创建记录器,但我确实更改根记录器的配置;
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')
Run Code Online (Sandbox Code Playgroud)