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中序列与字典的相同和不同之处
Jan 19 Python
sublime text 3配置使用python操作方法
Jun 11 Python
Python设计模式之命令模式简单示例
Jan 10 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
May 04 Python
关于django 数据库迁移(migrate)应该知道的一些事
May 27 Python
python实现决策树分类
Aug 30 Python
详解Python 正则表达式模块
Nov 05 Python
python远程邮件控制电脑升级版
May 23 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 Python
scrapy redis配置文件setting参数详解
Nov 18 Python
教你如何用Python实现人脸识别(含源代码)
Jun 23 Python
Python实现为PDF去除水印的示例代码
Apr 03 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
php4与php5的区别小结(配置异同)
2011/12/20 PHP
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
JavaScript操作Cookie详解
2015/02/28 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
ES6知识点整理之Proxy的应用实例详解
2019/04/16 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
Python正则表达式指南 推荐
2018/10/09 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
浅谈python出错时traceback的解读
2020/07/15 Python
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
工程管理专业个人求职信范文
2013/12/07 职场文书
2014年庆元旦活动方案
2014/02/15 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
郭明义观后感
2015/06/08 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
修改Nginx配置返回指定content-type的方法
2022/09/23 Servers