我在一个记录器中有 3 个处理程序
StreamHandler setLevel(args.logging_level)
logging.FileHandler(logging.ERROR)
RotatingFileHandler(args.logging_level)
logger.setLevel(args.logging_level)
我的代码在使用
logger = logging.getLogger('same_name_everywhere')
像这样产生重复的行和重复的处理程序,2 个流处理程序,3 个旋转文件处理程序
While 1 Stream Handler + 2 Rotating FileHanders (1 for errlog, 1 for generic log)
这是由
完成的
logger.warn(logger.handlers)
cli_normalize_string: WARNING [<StreamHandler <stderr> (DEBUG)>, <RotatingFileHandler /tmp/cli.normalize_string.py.2020-11-02.user.errlog (ERROR)>, <StreamHandler <stderr> (DEBUG)>, <RotatingFileHandler /tmp/cli.normalize_string.py.2020-11-02.user.log (DEBUG)>, <RotatingFileHandler /tmp/cli.normalize_string.py.2020-11-02.user.errlog (ERROR)>]
我改成之后
# The name is now become change.cli_normalize_string or change.normalize_string
logger = logger.getLogger(__name__)
在每个模块中,问题已解决,没有重复的行,1 个 StreamHeader,1 个用于错误日志记录的 FileHandler,1 个用于通用日志记录的 RotatingFileHandler
2020-11-02 21:26:05,856 cli_normalize_string INFO [<StreamHandler <stderr> (DEBUG)>, <FileHandler /tmp/cli.normalize_string.py.2020-11-02.user.errlog (ERROR)>, <RotatingFileHandler /tmp/cli.normalize_string.py.2020-11-02.user.log (DEBUG)>]
详细信息在本文档中
https://docs.python.org/3/library/logging.html
请注意,永远不要直接实例化 Logger,而应始终通过模块级函数 logging.getLogger(name) 实例化。多次调用具有相同名称的 getLogger() 将始终返回对同一 Logger 对象的引用。”
名称可能是一个以句点分隔的分层值,例如 foo.bar.baz(尽管它也可能只是简单的 foo,例如)。层次列表中更靠下的记录器是列表中更高的记录器的子级。例如,给定一个名为 foo 的记录器,
具有以下名称的记录器
foo.bar
foo.bar.baz
foo.bam
都是foo的后代。记录器名称层次结构类似于 Python 包层次结构,如果您组织起来,则与它相同
您的记录器在每个模块的基础上使用推荐的结构
logging.getLogger(__name__).
那是因为在一个模块中,
__name__
是 Python 包命名空间中的模块名称。