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 ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
Python数据类型详解(四)字典:dict
May 12 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
Jan 20 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 Python
Django压缩静态文件的实现方法详析
Aug 26 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
python提取照片坐标信息的实例代码
Aug 14 Python
python关闭占用端口方式
Dec 17 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
Mar 10 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 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 开源AJAX框架14种
2009/08/24 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
理解Javascript_05_原型继承原理
2010/10/13 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
vue webpack重写cookie路径的方法
2019/07/10 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
详解Python中如何写控制台进度条的整理
2018/03/07 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
Sony C++笔试题
2013/03/10 面试题
如何开发一个JQuery插件
2016/07/28 面试题
数控加工专业毕业生自荐信
2013/09/27 职场文书
2014两会学习心得:时代的发展
2014/03/17 职场文书
村安全生产责任书
2014/08/25 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
礼貌问候语大全
2015/11/10 职场文书
Python 数据结构之十大经典排序算法一文通关
2021/10/16 Python