python - 为什么对同一个函数有这么多的调用?
问题描述
我不确定我在这里缺少什么,但请参阅下面的代码
def TestLogger(name):
logger = logging.getLogger(name)
logger.setLevel(LOG_LEVEL)
handler = logging.FileHandler(LOG_FILE)
handler.setFormatter(Formatter(LOG_FORMAT))
handler.setLevel(LOG_LEVEL)
logger.addHandler(handler)
return logger
def printme( str ):
logger = TestLogger(__name__)
logger.debug( str)
return
def main(args=None):
logger = TestLogger(__name__)
printme("1");
printme("2");
printme("3");
if __name__ == "__main__":
main()
作为回报,我预计只有三行,但我得到了这么多......我在这里错过了什么?输出:
09:45:00,017 [DEBUG]:[__main__]: 1 in C:/demo/TryMe.py:61 2019-05-16
09:45:00,017 [DEBUG]:[__main__]: 1 in C:/demo/TryMe.py:61 2019-05-16
09:45:00,018 [DEBUG]:[__main__]: 2 in C:/demo/TryMe.py:61 2019-05-16
09:45:00,018 [DEBUG]:[__main__]: 2 in C:/demo/TryMe.py:61 2019-05-16
09:45:00,018 [DEBUG]:[__main__]: 2 in C:/demo/TryMe.py:61 2019-05-16
09:45:00,019 [DEBUG]:[__main__]: 3 in C:/demo/TryMe.py:61 2019-05-16
09:45:00,019 [DEBUG]:[__main__]: 3 in C:/demo/TryMe.py:61 2019-05-16
09:45:00,019 [DEBUG]:[__main__]: 3 in C:/demo/TryMe.py:61 2019-05-16
09:45:00,019 [DEBUG]:[__main__]: 3 in C:/demo/TryMe.py:61
解决方案
每次调用TestLogger
它都会向记录器添加另一个处理程序。每个处理程序都会打印一条日志消息。
你调用它一次main()
。然后,当您调用时,您printme("1")
再次调用它。所以它记录1
了两次。
当您调用时printme("2")
,您会第三次调用它,因此它会记录2
三次。
当您调用时,printme("3")
您会再次调用它,因此它会记录3
四次。
您应该只调用TestLogger()
一次,并将其作为参数传递给printme()
.
def printme( str, logger ):
logger.debug( str)
return
def main(args=None):
logger = TestLogger(__name__)
printme("1", logger);
printme("2", logger);
printme("3", logger);
这也是全局变量的合理用途,而不是必须logger
作为参数传递给可能需要进行日志记录的每个函数。
或者您可以放入logger = logging.getLogger(__name__)
除main()
. 这将获得由TestLogger()
.
推荐阅读
- reactjs - 如何从另一个组件的 onclick 事件中触发函数
- java - 我们如何使用 Java 函数实现 add(4)(10)(20)(3)(1).total?
- c - 为什么通过两个循环递增后变量值达到5050?(循环到 100)
- java - 具有匿名内部类的双重通用链表(在函数中)
- maven - YET ERROR StatusLogger 找不到 Log4j 2 配置文件。使用默认配置
- blueprism - 用于提取收集数据的蓝色棱镜代码阶段
- c# - C# 不能隐式转换类型'System.Collections.Generic.List
' 到 'System.Windows.Documents.List' - javascript - 将 { queue: false } 传递给 jQuery show()
- powershell - Linux 上的 PowerShell 配置文件位置是什么?
- java - 如何使用java processbuilder在su下运行命令?