问题描述

问题代码如下:

def get_logger(logger_name):
"""得到日志对象"""
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('[ %(asctime)s ] - %(levelname)s - %(message)s')
# 用于输出至文件
file_log_handler = logging.FileHandler(settings.VIEW_LOG_PATH, encoding=settings.DEFAULT_CHARSET)
file_log_handler.setLevel(logging.DEBUG)
file_log_handler.setFormatter(formatter)
# logger绑定处理对象
logger.addHandler(file_log_handler)
return logger

此时例如执行logger = get_logger('HCS'),并且后续日志对象的logger_name均是HCS时,此后多次打印日志会出现日志信息条数线性增加,例如第一次打印一条,第二条打印相同的两条日志,第三次打印相同的三条日志.......

原因

因为logger的name被固定,所以当你第一次为logger对象添加FileHandler对象之后,如果没有移除上一次的FileHandler对象,第二次logger对象就会再次获得相同的FileHandler对象,即拥有两个FileHandler对象,最终造成打印两次,同样,如果此时没有立即移除上一次的FileHandler对象,第三次logger对象就会再次获得相同的FileHandler对象,即拥有三个FileHandler象,最终打印3次........

解决办法

1.每次添加日志,创建与上次日志对象的name属性不同的logger对象

2.通过logger对象的handlers属性,控制重复输出(推荐

def get_logger(logger_name):
"""得到日志对象"""
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('[ %(asctime)s ] - %(levelname)s - %(message)s')
if not logger.handlers:
# 用于输出至文件
file_log_handler = logging.FileHandler(settings.VIEW_LOG_PATH, encoding=settings.DEFAULT_CHARSET)
file_log_handler.setLevel(logging.DEBUG)
file_log_handler.setFormatter(formatter)
# logger绑定处理对象
logger.addHandler(file_log_handler)
return logger

3.每次logger输出后,移除FileHandler对象

[已解决] Python logging 重复打印日志信息的更多相关文章

  1. 解决python logging重复写日志问题

    import logging from homework.exam_homework_0413.common import contants from homework.exam_homework_0 ...

  2. Mybatis框架基于映射文件和配置文件的方式,实现增删改查,可以打印日志信息

    首先在lib下导入: 与打印日志信息有关的架包 log4j-1.2.16.jar mybatis架包:mybatis-3.1.1.jar 连接数据库的架包:mysql-connector-java-5 ...

  3. Python递归_打印节点信息

    Python递归_打印节点信息 递归特性:1.必须由一个明确的结束条件2.每次进入更深一层递归时,问题规模相比上一次递归都应该有所减少3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时 ...

  4. 如何解决源码安装软件中make时一直重复打印configure信息

    在通过源码安装软件时,会出现执行./configure后再make时总是重复打印configure的信息,无法进入下一阶段的安装. 主要原因是系统当前的时间与实际时间不一致,特别是在虚拟机上经常会出现 ...

  5. 使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)

    说来惭愧,今天就写了个"hello world",了解了一下log4j的日志. 本来是想在控制台打印个log信息,也是遇到坎坷重重,开始也没去了解log4j就来使用,log4j配置 ...

  6. Python traceback 模块, 打印异常信息

    Python感觉是模仿Java, 到处都需要加try..catch.... 这里记录一下用法,方便后续使用. # -*- coding:utf-8 -*- import os import loggi ...

  7. log4j2重复打印日志问题解决

    log4j2.xml <?xml version="1.0" encoding="UTF-8"?> <Configuration> &l ...

  8. 解决华为手机不打印Log信息的问题

    在之前安装了Android Studio后,发现了一个很苦恼的事情,就是在程序中的写Log语句,不能正常的在Logcat中打印出来,这对于解决程序bug真是一刀切断,让人无从下手,在各种尝试后,首先我 ...

  9. log4j.properties打印日志信息(1)

    log4j.properties log4j.rootLogger=debug,stdout,logfile ### 把日志信息输出到控制台 ### log4j.appender.stdout=org ...

随机推荐

  1. C# vb .NET读取识别条形码线性条码EAN-13

    EAN-13是比较常见的条形码编码规则类型的一种.如何在C#,vb等.NET平台语言里实现快速准确读取该类型条形码呢?答案是使用SharpBarcode! SharpBarcode是C#快速高效.准确 ...

  2. 递归-求n和n以前的自然数

    #include <iostream> using namespace std; void zrs(int n)//用递归求自然数(n和它之前) { ) { cout<<< ...

  3. 使用Nginx 对Laravel 进行负载

    项目环境php7.2, nginx , Laravel,开发的微信公众号应用 .目前访问量的上升,单台服务器不能满足需求,于是用nginx做了负载.以下是一种可行性方案,目前正在使用. session ...

  4. 2019 满帮java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.满帮等公司offer,岗位是Java后端开发,因为发展原因最终选择去了满帮,入职一年时间了,也成为了面试官,之 ...

  5. 时间格式在ios和安卓兼容性的问题:

    在做项目时,在时间显示上遇到一个问题,取后台返回的时间时,在ios手机上时间不显示,安卓手机正常,最后通过Vconsole工具发现,ios不能支持用“—”分割的时间,此外后台返回的时间格式为x年x月x ...

  6. Socket-网络服务提供的一种机制

    网络编程 网络通信的要素 Ip,端口,协议(tcp/udp) 127.0.0.1 本机地址   默认主机名:localhost   端口号:用于标识进程的逻辑地址. 有效端口:0-65535   其中 ...

  7. FreePascal - Typhon如何添加不能识别单元?

    Typhon 32位 6.9 问题:想使用LSUtils单元,这个单元在Lazarus里面,直接引入就可以使用,而且单元头注释明显写明是CodeTyphon工程的一部分,那么正常在Typhon只要引入 ...

  8. Python列表,元组,字典,集合

    列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能. 列表追加数据的方法:append(),extend(数组),insert(位 ...

  9. Cheat Engine 作弊表框架代码

    打开游戏 打开自动汇编 扫描的所有过程,这里就省略了 引用作弊表框架代码 查找使阳光减少的地址 拷贝这个地址 添加到自动汇编脚本里,并添加汇编指令 分配到当前作弊表 生成自动汇编脚本 进行激活测试 可 ...

  10. byte[],File和InputStream的相互转换

    File.FileInputStream 转换为byte[] File file = new File("test.txt"); InputStream input = new F ...