python控制台打印log输出重复的解决方法
作者:橙好测试开发 时间:2021-02-23 04:05:17
在我们使用log模块输出日志时,经常会遇到log输出重复的问题,如下:
先来看这个文件log.py的代码:
代码示例:
'''
功能描述:实现控制台和文件同时记录日志的功能
编写人:超哥
编写日期:
步骤分析:
1-配置日志记录器名称
2-配置日志级别
3-配置日志格式(可以分别设置,也可以统一设置)
4-创建并添加handler-控制台
5-创建并添加handler-文件
6-提供对外获取logger
'''
import logging
import sys
def log():
# 1 - 配置日志记录器名称
logger = logging.getLogger('AutoTest')
# 2-配置日志级别
logger.setLevel(logging.DEBUG)
# 3-配置日志格式(可以分别设置,也可以统一设置)
format = logging.Formatter('%(name)s-%(asctime)s-%(message)s')
# 4 - 创建并添加handler - 控制台
sh = logging.StreamHandler()
sh.setFormatter(format)
logger.addHandler(sh)
# 5 - 创建并添加handler - 文件
fh = logging.FileHandler('test.log')
fh.setFormatter(format)
logger.addHandler(fh)
# 6 - 提供对外获取logger
return logger
if __name__ == '__main__':
logger = log()
logger.info('使用函数定义的log方法')
我们在同一目录下创建另外一个文件:
在我们导入写好的log.py文件
from xx目录 import log
log().info('xxx1')
log().info('xxx2')
log().info('xxx3')
输出:
这个结果什么鬼?明明三句话,打印出来这么多,这其实是log在使用的常遇到的坑,通过debug你会发现,每次调用都会创建句柄,所以重复,如图:
第一句调用之后,handlers里面已经存在了两个handler,分别是控制台句柄StreamHandler和文件句柄FileHandler,下面图中是第二句调用添加句柄
执行后会发现handlers里面多了一个StreamHandler
怎么解决这种情况,有两个方案,咱们分别列出两种方案代码:
第一种,第一使用单例模式,在log.py文件中增加一行:logger = log() ,这句的作用就是提前实例化好对象,其他模块使用都适用该对象,所以别的模块导入语句要改成:from xxx包.log import logger ,然后使用logger.info('xxxx') 输出日志即可
……省略上方代码
# 6 - 提供对外获取logg的方法
return logger
#增加一行
logger = log()
if __name__ == '__main__':
logger = log()
logger.info('使用函数定义的log方法')
导入:
from xx包 import logger
logger.info('xxx1')
logger.info('xxx2')
logger.info('xxx3')
输出:
第二个方案:log.py每次判断handlers是否已存在
……
# 4 - 创建并添加handler - 控制台
sh = logging.StreamHandler()
sh.setFormatter(format)
# 5 - 创建并添加handler - 文件
fh = logging.FileHandler('test.log')
fh.setFormatter(format)
#在新增handler时判断是否为空
if not logger.handlers:
logger.addHandler(sh)
logger.addHandler(fh)
# 6 - 提供对外获取logg的方法
return logger
if __name__ == '__main__':
logger = log()
logger.info('使用函数定义的log方法')
导入文件代码保持不变:
from xx包 import log
log().info('xxx1')
log().info('xxx2')
log().info('xxx3')
输出:
针对面向对象的方案同样是以上两个,请自行解决
来源:https://blog.csdn.net/rainshine1190/article/details/116675853
标签:python,控制台,log
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python基于time模块求程序运行时间的方法
2023-07-27 15:59:03
![](https://img.aspxhome.com/file/2023/0/61220_0s.png)
python中使用PIL制作并验证图片验证码
2023-06-05 11:28:33
基于Python实现帕累托图的示例详解
2022-06-28 05:48:00
![](https://img.aspxhome.com/file/2023/2/101562_0s.png)
python实现守护进程、守护线程、守护非守护并行
2021-02-03 09:06:56
Python多线程的使用详情
2023-05-29 15:13:36
Python中使用md5sum检查目录中相同文件代码分享
2022-10-31 19:57:59
OpenCV实现去除背景识别的方法总结
2021-01-06 23:04:10
![](https://img.aspxhome.com/file/2023/0/83880_0s.jpg)
python密码学Base64编码和解码教程
2022-12-10 13:13:47
![](https://img.aspxhome.com/file/2023/1/100871_0s.jpg)
Python np.where()的详解以及代码应用
2023-02-15 18:33:01
Python socket实现多对多全双工通信的方法
2023-05-02 17:31:38
PHP高级编程实例:编写守护进程
2023-10-27 02:03:22
python导入csv文件出现SyntaxError问题分析
2023-12-12 04:29:57
如何在Django配置文件里配置session链接
2022-09-08 18:17:33
ASP.NET中使用SQL存储过程的方法
2007-08-24 09:31:00
设计较好付款流程的12个建议
2009-06-08 12:45:00
![](https://img.aspxhome.com/file/UploadPic/20096/8/11-95s.png)
Update 语句
2009-06-22 12:52:00
Python比较两个日期的两种方法详解
2023-12-25 03:52:17
![](https://img.aspxhome.com/file/2023/6/86396_0s.png)
Python魔法方法 容器部方法详解
2021-02-05 19:25:43
浅谈Python之Django(三)
2021-07-07 00:38:25
![](https://img.aspxhome.com/file/2023/3/77743_0s.png)
重命名SQLServer数据库的方法
2012-07-11 15:39:37