我是否需要显式检查“名称”__主要的;在Python中调用getLogger之前?
我相信使用Python的内置日志模块将主模块中的我是否需要显式检查“名称”__主要的;在Python中调用getLogger之前?,python,logging,Python,Logging,我相信使用Python的内置日志模块将主模块中的logger作为根日志记录器是一种标准做法。假设这是正确的,在我看来,对于任何可以或不可以作为main运行的模块,我都需要显式地进行检查。原因是,如果我遵循调用logging.getLogger(\uuuu name\uuuuu)的标准实践,我将得到一个名为\uuuuuu main\uuuuu的记录器,而不是根记录器: import logging print logging.getLogger().name # root print loggin
logger
作为根日志记录器是一种标准做法。假设这是正确的,在我看来,对于任何可以或不可以作为main运行的模块,我都需要显式地进行检查。原因是,如果我遵循调用logging.getLogger(\uuuu name\uuuuu)
的标准实践,我将得到一个名为\uuuuuu main\uuuuu
的记录器,而不是根记录器:
import logging
print logging.getLogger().name # root
print logging.getLogger(__name__).name # __main__
最好的做法总是检查吗
if __name__ == "__main__":
logger = logging.getLogger()
else:
logger = logging.getLogger(__name__)
这并不是那么糟糕,因为我总是会有其他代码,只有在
\uuuu name\uuuu==“\uuuu main\uuuuu”
的情况下才会运行(通常包括调用logging.basicConfig
),但如果只需要一行而不需要更多,那就太好了。是的-我相信这是个好主意。因为-发生的事情如下-
如果您以python prog.py的形式运行一个程序——
\uuuuu name\uuuuuuu
将是\uuuuuu main\uuuuu
),您将获得根日志(预期)。或者你甚至可以给出你想要的名字(比如prog
)。当您导入该模块时,名称将是该模块的名称。(python文件名,在本例中不带扩展名prog
),这将帮助您识别日志的来源-这是您想要的。所以一般来说,这样做是个好主意 使用logging.getLogger(\uuuu name\uuuu)
的实践是针对模块级记录器的,如
在脚本(或应用程序的主模块)中,我通常根本不创建记录器,但我会更改根记录器的配置
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')
因此,我可能有一个名为\uuuuu main\uuuu
的模块级记录器和一个根记录器,如果我想附加一个处理程序来处理我的所有日志记录,请触摸根记录器。因此,您可以执行以下操作:logger=logging.getLogger(*([\uuuuu name\uuuuuuuuuu]if.\uuuuuu name\uuuuuuuu!='\uuuuu main\uuuuuuuuuuuuuuuuu'else[])