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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 Python
Python中的面向对象编程详解(上)
Apr 13 Python
Django Admin 实现外键过滤的方法
Sep 29 Python
python实现xlsx文件分析详解
Jan 02 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
使用python画社交网络图实例代码
Jul 10 Python
Python交互式图形编程的实现
Jul 25 Python
python使用pymongo与MongoDB基本交互操作示例
Apr 09 Python
Pytorch 使用 nii数据做输入数据的操作
May 26 Python
基于Python的EasyGUI学习实践
May 07 Python
Python采集股票数据并制作可视化柱状图
Apr 04 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完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
php设计模式  Command(命令模式)
2011/06/17 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
简单的自定义php模板引擎
2016/08/26 PHP
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
Angular.js如何从PHP读取后台数据
2016/03/24 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
Python import用法以及与from...import的区别
2015/05/28 Python
python开发之thread线程基础实例入门
2015/11/11 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
大学生个人简历自我评价
2013/11/16 职场文书
室内设计专业自荐信
2014/05/31 职场文书
订货会邀请函
2015/01/31 职场文书
导游词开场白
2015/01/31 职场文书
2015年党建工作总结
2015/03/30 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android