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 22 Python
用Python写一个无界面的2048小游戏
May 24 Python
python运行其他程序的实现方法
Jul 14 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
Python判断中文字符串是否相等的实例
Jul 06 Python
Python提取频域特征知识点浅析
Mar 04 Python
深入解析python中的实例方法、类方法和静态方法
Mar 11 Python
python的依赖管理的实现
May 14 Python
Python实现微信机器人的方法
Sep 06 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
php中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
php技巧小结【推荐】
2017/01/19 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
Javascript实现的Map集合工具类完整实例
2015/07/31 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
Bootstrap源码解读模态弹出框(11)
2016/12/28 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
python 根据pid杀死相应进程的方法
2017/01/16 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
如何基于线程池提升request模块效率
2020/04/18 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
查看keras的默认backend实现方式
2020/06/19 Python
python中yield的用法详解
2021/01/13 Python
介绍Java的内部类
2012/10/27 面试题
中专毕业自我鉴定
2013/10/16 职场文书
面料业务员岗位职责
2013/12/26 职场文书
幼儿园家长会邀请函
2014/01/15 职场文书
互联网创业计划书的书写步骤
2014/01/28 职场文书
民族学专业求职信
2014/07/28 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
车辆年审委托书范本
2014/09/18 职场文书
优秀团队申报材料
2014/12/26 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
暖春观后感
2015/06/08 职场文书
运动会200米广播稿
2015/08/19 职场文书