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操作MySQL数据库具体方法
Oct 28 Python
实例讲解Python中的私有属性
Aug 21 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
python文件转为exe文件的方法及用法详解
Jul 08 Python
python中的TCP(传输控制协议)用法实例分析
Nov 15 Python
Python设计密码强度校验程序
Jul 30 Python
python基于exchange函数发送邮件过程详解
Nov 06 Python
详解用 python-docx 创建浮动图片
Jan 24 Python
python Polars库的使用简介
Apr 21 Python
python 如何执行控制台命令与操作剪切板
May 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
php5 apache 2.2 webservice 创建与配置(java)
2011/01/27 PHP
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
php图片上传类 附调用方法
2016/05/15 PHP
理解JavaScript中的对象 推荐
2011/01/09 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
全面解析JavaScript中“&&”和“||”操作符(总结篇)
2016/07/18 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
js实现5秒倒计时重新发送短信功能
2017/02/05 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
JS document对象简单用法完整示例
2020/01/14 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
vue编写简单的购物车功能
2021/01/08 Vue.js
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
用matplotlib画等高线图详解
2017/12/14 Python
详解Python_shutil模块
2019/03/15 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
几道数据库的概念性面试题
2014/05/30 面试题
几道Web/Ajax的面试题
2016/11/05 面试题
大学生入党思想汇报
2014/01/14 职场文书
幼儿园庆六一游园活动方案
2014/01/29 职场文书
青年文明号服务承诺
2014/03/31 职场文书
单方离婚协议书范本(2014版)
2014/09/30 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
2015年科协工作总结
2015/05/19 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
导游词之杭州西湖
2019/09/19 职场文书