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 相关文章推荐
将图片文件嵌入到wxpython代码中的实现方法
Aug 11 Python
使用python实现个性化词云的方法
Jun 16 Python
深入理解Django中内置的用户认证
Oct 06 Python
基于DataFrame筛选数据与loc的用法详解
May 18 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
python读取csv和txt数据转换成向量的实例
Feb 12 Python
Python转换时间的图文方法
Jul 01 Python
Python使用pdb调试代码的技巧
May 03 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
Python数据分析入门之数据读取与存储
May 13 Python
Django框架中视图的用法
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
用在PHP里的JS打印函数
2006/10/09 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
javascript:window.open弹出窗口的位置问题
2014/03/18 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
用Node编写RESTful API接口的示例代码
2018/07/04 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
Python备份Mysql脚本
2008/08/11 Python
Python文件操作类操作实例详解
2014/07/11 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
彻底理解Python list切片原理
2017/10/27 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
最新pycharm安装教程
2020/11/18 Python
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
2013年员工自我评价范文
2013/12/27 职场文书
简历里的自我评价范文
2014/02/24 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
工作检讨书怎么写
2015/01/23 职场文书
商务英语求职信范文
2015/03/19 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
Oracle创建只读账号的详细步骤
2021/06/07 Oracle
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis
如何用六步教会你使用python爬虫爬取数据
2022/04/06 Python
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android