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')

输出:

针对面向对象的方案同样是以上两个,请自行解决

总结

到此这篇关于python控制台打印log输出重复解决的文章就介绍到这了,更多相关python打印log重复内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python loguru日志库之高效输出控制台日志和日志记录

    1安装loguru loguru的PyPI地址为:https://pypi.org/project/loguru/ GitHub仓库地址为:https://github.com/Delgan/loguru 我们可以直接使用pip命令对其进行安装 pip install loguru 或者下载其源码,使用Python命令进行安装. |2loguru简单使用 from loguru import logger logger.info("中文loguru") logger.debug(&qu

  • Python同时向控制台和文件输出日志logging的方法

    本文实例讲述了Python同时向控制台和文件输出日志logging的方法.分享给大家供大家参考.具体如下: python提供了非常方便的日志模块,可实现同时向控制台和文件输出日志的功能. #-*- coding:utf-8 -*- import logging # 配置日志信息 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt

  • python 通过logging写入日志到文件和控制台的实例

    如下所示: import logging # 创建一个logger logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG) # 创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') fh.setLevel(logging.DEBUG) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() ch.set

  • python控制台打印log输出重复的解决方法

    在我们使用log模块输出日志时,经常会遇到log输出重复的问题,如下: 先来看这个文件log.py的代码: 代码示例: ''' 功能描述:实现控制台和文件同时记录日志的功能 编写人:超哥 编写日期: 步骤分析:   1-配置日志记录器名称   2-配置日志级别   3-配置日志格式(可以分别设置,也可以统一设置)   4-创建并添加handler-控制台   5-创建并添加handler-文件   6-提供对外获取logger ''' import logging import sys def 

  • Python使用logging模块实现打印log到指定文件的方法

    本文实例讲述了Python使用logging模块实现打印log到指定文件的方法.分享给大家供大家参考,具体如下: 可能我们经常会使用print来输出信息到窗口,但当我们有很多个py文件需要运行,项目比较庞大的到时候,print简直就是太low了点了.那么我们可以使用强大的logging模块,把输出到指定的本地pc某个路径的文件中. 一.logging的框架 1. Loggers: 可供程序直接调用的接口,app通过调用提供的api来记录日志 2. Handlers: 决定将日志记录分配至正确的目

  • nohup后台启动Python脚本,log不刷新的解决方法

    问题: =>nohup python3 xxxx.py &后台启动脚本 tail -100f nohup.out    -------->     无显示 原因: python的输出有缓冲,导致日志文件并不能够马上看到输出. -u参数,使得python不启用缓冲. 方法: 所以修改命令即可: nohup python3 -u xxxx.py > nohup.out & 以上这篇nohup后台启动Python脚本,log不刷新的解决方法就是小编分享给大家的全部内容了,希望能

  • python tornado修改log输出方式

    sed -i 's/StreamHandler()/StreamHandler(sys.__stdout__)/' /opt/python/python3/lib/python3.6/site-packages/tornado/log.py 将手动打印的后台信息输出到stdout,重定向到文件 设置时区: timedatectl set-timezone 'Asia/Shanghai' 启动项目: nohup python3 cluster.py >> logs/deploy.log &

  • Xcode8打印一堆log问题的快速解决方法

    刚装的xcode8,不知道从哪来的一堆log 去除一堆log的方法: Xcode8--->Product---- Edit Scheme... -> Run -> Arguments, 在Environment Variables里边添加 OS_ACTIVITY_MODE = disable 以上所述是小编给大家介绍的Xcode8打印一堆log问题的快速解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持!

  • python中print的不换行即时输出的快速解决方法

    关于Python2.x和3.x带来的print不换行的问题:昨天有发过推文,利用end = 定义,解决了横向的小问题,但是由于屏幕显示的问题,若字符串长度过大,则会引起不便.两个或多个print做分割的情况下,如何保持依然横向输出,一般的是在print尾部加上逗号(,)但是在3.x下,则不行,需要使用end = "(something)",some signs like , . ; 'also you can put a word or str in"". Exam

  • Python运行不显示DOS窗口的解决方法

    方法1:pythonw xxx.py 方法2:将.py改成.pyw (这个其实就是使用脚本解析程序pythonw.exe) 跟 python.exe 比较起来,pythonw.exe 有以下的不同: 1)执行时不会弹出控制台窗口(也叫 DOS 窗口) 2)所有向原有的 stdout 和 stderr 的输出都无效 3)所有从原有的 stdin 的读取都只会得到 EOF 注:唯独视窗版 Python 有 .pyw 格式. 以上这篇Python运行不显示DOS窗口的解决方法就是小编分享给大家的全部内

  • springboot 配置日志 打印不出来sql的解决方法

    今天整合springboot2 + mybatis + logback 遇到了在日志中sql打印不出来的坑,在网上找了好久,都不是我遇到的问题,这里吐槽一下下现在的博客质量,好多都是抄袭的,也没有标注转载. 先说下要将sql打印到日志的配置 1.在mybatis.xml配置中增加以下配置 <!--指定 MyBatis 增加到日志名称的前缀.--> <setting name="logPrefix" value="m-shop-mybatis-sql.&quo

  • vue props传值失败 输出undefined的解决方法

    如果在prop中传的值为一个没有使用特殊命名规则的变量如:(type),可以顺利传值: <code class="language-html"><div id="app"> <test :type="type"></test> </div> Vue.component("test", { props: ['type'], template: '<div @cli

随机推荐