python控制台打印log输出重复的解决方法


Posted in Python onMay 14, 2021

在我们使用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')

输出:

python控制台打印log输出重复的解决方法

这个结果什么鬼?明明三句话,打印出来这么多,这其实是log在使用的常遇到的坑,通过debug你会发现,每次调用都会创建句柄,所以重复,如图:

第一句调用之后,handlers里面已经存在了两个handler,分别是控制台句柄StreamHandler和文件句柄FileHandler,下面图中是第二句调用添加句柄

python控制台打印log输出重复的解决方法

执行后会发现handlers里面多了一个StreamHandler

python控制台打印log输出重复的解决方法

怎么解决这种情况,有两个方案,咱们分别列出两种方案代码:

第一种,第一使用单例模式,在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')

输出:

python控制台打印log输出重复的解决方法

第二个方案: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')

输出:

python控制台打印log输出重复的解决方法

针对面向对象的方案同样是以上两个,请自行解决

总结

到此这篇关于python控制台打印log输出重复解决的文章就介绍到这了,更多相关python打印log重复内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 获得13位unix时间戳的方法
Oct 20 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
基于Python中capitalize()与title()的区别详解
Dec 09 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
使用Python将Mysql的查询数据导出到文件的方法
Feb 25 Python
python实现共轭梯度法
Jul 03 Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
Python dict的常用方法示例代码
Jun 23 Python
详解python tkinter 图片插入问题
Sep 03 Python
python3美化表格数据输出结果的实现代码
Apr 14 Python
聊一聊python常用的编程模块
May 14 #Python
如何获取numpy array前N个最大值
May 14 #Python
使用pandas模块实现数据的标准化操作
pandas 实现将NaN转换为None
May 14 #Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
Python爬虫:从m3u8文件里提取小视频的正确操作
MATLAB 全景图切割及盒图显示的实现步骤
You might like
PHP分页效率终结版(推荐)
2013/07/01 PHP
PHP编程基本语法快速入门手册
2016/01/07 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
python如何发布自已pip项目的方法步骤
2018/10/09 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
家长会演讲稿范文
2014/01/10 职场文书
上课迟到检讨书100字
2014/01/11 职场文书
班主任班级寄语大全
2014/04/04 职场文书
学校火灾防控方案
2014/06/09 职场文书
离婚财产处理协议书
2014/09/30 职场文书
人大代表选举标语
2014/10/07 职场文书
2015年感恩节演讲稿(优选篇)
2015/03/20 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
2016教师节问候语
2015/11/10 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python
解决Pytorch中关于model.eval的问题
2021/05/22 Python
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle