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装饰器使用方法实例
Nov 21 Python
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
Dec 03 Python
Python定时器实例代码
Nov 01 Python
pandas系列之DataFrame 行列数据筛选实例
Apr 12 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
Apr 21 Python
python smtplib发送带附件邮件小程序
May 22 Python
对Python random模块打乱数组顺序的实例讲解
Nov 08 Python
深入了解和应用Python 装饰器 @decorator
Apr 02 Python
python pandas生成时间列表
Jun 29 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
想学画画?python满足你!
Dec 24 Python
浅析pandas随机排列与随机抽样
Jan 22 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迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
php制作文本式留言板
2015/03/18 PHP
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
js判断变量是否空值的代码
2008/10/26 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
jQuery简单注册和禁用全局事件的方法
2016/07/25 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
浅析python标准库中的glob
2020/03/13 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
HTML5拖放API实现自动生成相框功能
2020/04/07 HTML / CSS
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
电子商务专业自我鉴定
2013/12/18 职场文书
乡镇消防工作实施方案
2014/03/27 职场文书
服装设计专业求职信
2014/06/16 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
病假证明模板
2015/06/19 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL