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登陆asp网站页面的实现代码
Jan 14 Python
Django自定义分页与bootstrap分页结合
Feb 22 Python
Python socket套接字实现C/S模式远程命令执行功能案例
Jul 06 Python
python删除文件夹下相同文件和无法打开的图片
Jul 16 Python
Python通过cv2读取多个USB摄像头
Aug 28 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
python函数map()和partial()的知识点总结
May 26 Python
Python基于httpx模块实现发送请求
Jul 07 Python
python virtualenv虚拟环境配置与使用教程详解
Jul 13 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
Python爬虫基础之爬虫的分类知识总结
May 13 Python
Python3接口性能测试实例代码
Jun 20 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中的CMS的涵义
2007/03/11 PHP
PHP 命令行参数详解及应用
2011/05/18 PHP
PHP实现的带超时功能get_headers函数
2015/02/10 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
javascript常见操作汇总
2014/09/03 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
javascript基本语法
2016/05/31 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
Python中的fileinput模块的简单实用示例
2015/07/09 Python
python if not in 多条件判断代码
2016/09/21 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
Python列表操作方法详解
2020/02/09 Python
selenium自动化测试入门实战
2020/12/21 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
报关简历自我评价怎么写
2013/09/19 职场文书
国旗下演讲稿
2014/05/08 职场文书
食品安全汇报材料
2014/08/18 职场文书
组工干部演讲稿
2014/09/02 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
旷课检讨书范文
2014/10/30 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书
Python Matplotlib库实现画局部图
2021/11/17 Python
Python语言中的数据类型-序列
2022/02/24 Python
关于EntityWrapper的in用法
2022/03/22 Java/Android
部分武汉产收音机展览
2022/04/07 无线电