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实现保存网页到本地示例
Mar 16 Python
python使用正则表达式检测密码强度源码分享
Jun 11 Python
给Python初学者的一些编程技巧
Apr 03 Python
python3.6利用pyinstall打包py为exe的操作实例
Oct 31 Python
解决sublime+python3无法输出中文的问题
Dec 12 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
python rsa实现数据加密和解密、签名加密和验签功能
Sep 18 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
Jul 28 Python
python如何发送带有附件、正文为HTML的邮件
Feb 27 Python
用Python实现一个打字速度测试工具来测试你的手速
May 28 Python
利用python做数据拟合详情
Nov 17 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
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
Smarty模板快速入门
2007/01/04 PHP
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
2008/09/10 PHP
PHP中str_replace函数使用小结
2008/10/11 PHP
php7 安装yar 生成docker镜像
2017/05/09 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
PHP7 windows支持
2021/03/09 PHP
JQuery 操作Javascript对象和数组的工具函数小结
2010/01/22 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
VUE使用axios调用后台API接口的方法
2020/08/03 Javascript
Python写入CSV文件的方法
2015/07/08 Python
Python做文本按行去重的实现方法
2016/10/19 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
小溪流的歌教学反思
2014/02/13 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
2014年团总支工作总结
2014/11/21 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
推广普通话主题班会
2015/08/17 职场文书
工作自我评价范文
2019/03/21 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python