python控制台打印log输出重复的解决方法
作者:橙好测试开发 发布时间:2021-02-23 04:05:17
标签:python,控制台,log
在我们使用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')
输出:
这个结果什么鬼?明明三句话,打印出来这么多,这其实是log在使用的常遇到的坑,通过debug你会发现,每次调用都会创建句柄,所以重复,如图:
第一句调用之后,handlers里面已经存在了两个handler,分别是控制台句柄StreamHandler和文件句柄FileHandler,下面图中是第二句调用添加句柄
执行后会发现handlers里面多了一个StreamHandler
怎么解决这种情况,有两个方案,咱们分别列出两种方案代码:
第一种,第一使用单例模式,在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')
输出:
第二个方案: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')
输出:
针对面向对象的方案同样是以上两个,请自行解决
来源:https://blog.csdn.net/rainshine1190/article/details/116675853


猜你喜欢
- 开篇这段时间把主要精力都放在了K8S上,差点把Golang给忘了。那本篇就分享一下并发相关的内容(Goroutine和通道)。 本篇给出4个
- QTableWidget介绍QTableWidget是Qt程序中常用的显示数据表格的控件,类似于c#中的DataGrid。QTableWid
- 今天中午看了一集动漫《进击的巨人》,看完后发现这些视频的名称有点乱,于是编程来批量重命名。重命名之前的各名称格式为——飞极速【www.fei
- 首先我们先引入requests模块import requests一、发送请求r = requests.get('https://ap
- 前言MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_que
- 1.用python调用python脚本#!/usr/local/bin/python3.7import timeimport os coun
- Matplotlib简述:Matplotlib是一个用于创建出高质量图表的桌面绘图包(主要是2D方面)。该项目是由JohnHunter于20
- 本文给大家介绍sql server2012安装与启动图文教程,非常详细。sqlserver2012安装步骤如下所示:SQL Server 2
- 本文为大家分享了python查看微信消息撤回的具体代码,供大家参考,具体内容如下1.安装itchatitchat是一个开源的python微信
- 下面是我们经常会用到且非常有用的MySQL命令。下面你看到#表示在Unix命令行下执行命令,看到mysql>表示当前已经登录MySQL
- map()是python的一个内建函数, 他能够通过函数来处理序列,比如,我们相关一个数组[0,1,2,3,4,5]所有的数字都+2 , 当
- 本文实例讲述了mysql存储过程原理与使用方法。分享给大家供大家参考,具体如下:存储过程包含了一系列可执行的sql语句,存储过程存放于MyS
- 一般现今ASP木马常通过以下四点来操作服务器,所以我们只要将一下四处设置好就能从一 前使用IIS服务器的站长很多,特别是对于ASP网站来说,
- 本文实例讲述了Python根据已知邻接矩阵绘制无向图操作。分享给大家供大家参考,具体如下:有六个点:[0,1,2,3,4,5,6],六个点之
- 导语我第一次玩24点是初中的时候,那时候和堂弟表哥在堂妹家玩,堂妹提出玩24点游戏,堂妹比我们小三岁,可能正在上小学吧。拿出一副扑克牌去掉大
- 计算两个信号的交叉谱密度结果展示:完整代码:import numpy as npimport matplotlib.pyplot
- “正则表达式”对象,我们就可以非常方便的对各种数据进行合法性的校验了。首先,让我们来了解一下究竟什么
- 一、MySQL 逻辑架构概览MySQL 最重要、最与众不同的特性就是它的可插拔存储引擎架构(pluggable storage engine
- 对于日期的操作可以说是比较常见的case了,日期与格式化字符串互转,日期与时间戳互转,日期的加减操作等,下面主要介绍下常见的需求场景如何实现
- 引用计数Python默认的垃圾收集机制是“引用计数”,每个对象维护了一个ob_ref字段。它的优点是机制简单,当新的引用指向该对象时,引用计