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中cPickle用法例子分享
Jan 03 Python
Python实现返回数组中第i小元素的方法示例
Dec 04 Python
Python工厂函数用法实例分析
May 14 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
对pandas写入读取h5文件的方法详解
Dec 28 Python
python 为什么说eval要慎用
Mar 26 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
打包PyQt5应用时的注意事项
Feb 14 Python
python操作yaml说明
Apr 08 Python
Python如何使用27行代码绘制星星图
Jul 20 Python
python使用PySimpleGUI设置进度条及控件使用
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实现Ftp用户的在线管理的代码
2007/03/06 PHP
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
javascript动画效果类封装代码
2007/08/28 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
JavaScript获得指定对象大小的方法
2015/07/01 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
原生js图片轮播效果实现代码
2016/10/19 Javascript
Vue.js表单控件实践
2016/10/27 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
pycharm运行scrapy过程图解
2019/11/22 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
Python实现手绘图效果实例分享
2020/07/22 Python
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
学习十八大的心得体会
2014/09/01 职场文书
单位委托书格式范本
2014/09/29 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
员工工作及收入证明
2014/10/28 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
800字作文之大雪
2019/12/04 职场文书