[已解决] Python logging 重复打印日志信息
问题描述
问题代码如下:
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 重复打印日志信息的更多相关文章
- 解决python logging重复写日志问题
		import logging from homework.exam_homework_0413.common import contants from homework.exam_homework_0 ... 
- Mybatis框架基于映射文件和配置文件的方式,实现增删改查,可以打印日志信息
		首先在lib下导入: 与打印日志信息有关的架包 log4j-1.2.16.jar mybatis架包:mybatis-3.1.1.jar 连接数据库的架包:mysql-connector-java-5 ... 
- Python递归_打印节点信息
		Python递归_打印节点信息 递归特性:1.必须由一个明确的结束条件2.每次进入更深一层递归时,问题规模相比上一次递归都应该有所减少3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时 ... 
- 如何解决源码安装软件中make时一直重复打印configure信息
		在通过源码安装软件时,会出现执行./configure后再make时总是重复打印configure的信息,无法进入下一阶段的安装. 主要原因是系统当前的时间与实际时间不一致,特别是在虚拟机上经常会出现 ... 
- 使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)
		说来惭愧,今天就写了个"hello world",了解了一下log4j的日志. 本来是想在控制台打印个log信息,也是遇到坎坷重重,开始也没去了解log4j就来使用,log4j配置 ... 
- Python traceback 模块, 打印异常信息
		Python感觉是模仿Java, 到处都需要加try..catch.... 这里记录一下用法,方便后续使用. # -*- coding:utf-8 -*- import os import loggi ... 
- log4j2重复打印日志问题解决
		log4j2.xml <?xml version="1.0" encoding="UTF-8"?> <Configuration> &l ... 
- 解决华为手机不打印Log信息的问题
		在之前安装了Android Studio后,发现了一个很苦恼的事情,就是在程序中的写Log语句,不能正常的在Logcat中打印出来,这对于解决程序bug真是一刀切断,让人无从下手,在各种尝试后,首先我 ... 
- log4j.properties打印日志信息(1)
		log4j.properties log4j.rootLogger=debug,stdout,logfile ### 把日志信息输出到控制台 ### log4j.appender.stdout=org ... 
随机推荐
- mybatis映射mapper文件做like模糊查询
			方法:使用concat函数连接通配符 
- HeRaNO's NOIP CSP Round Day 2 T2 PESTC
			对于我这种菜鸡来说还是挺有迷惑性的. 在考场发现答案问的是跟最值有关的数量,想到二分,结果果然具有单调性,考虑二份答案+验证 其实什么反转什么的,可以不用去管他,对于长度小于二分答案mid的道路,不去 ... 
- 【转】Webpack 快速上手(中)
			由于文章篇幅较长,为了更好的阅读体验,本文分为上.中.下三篇: 上篇介绍了什么是 webpack,为什么需要 webpack,webpack 的文件输入和输出 中篇介绍了 webpack 在输入和输出 ... 
- echart绘制GDP数据
			{% extends "base.html" %} {% block self_head_css_js %} {% endblock %} {% block main_conten ... 
- 打造属于你的提供者(Provider = Strategy + Factory Method)  设计模式 - Provider Pattern(提供者模式)
			打造属于你的提供者(Provider = Strategy + Factory Method) 1.1.1 摘要 在日常系统设计中,我们也许听说过提供者模式,甚至几乎每天都在使用它,在.NET F ... 
- ML-线性 SVM 推导
			Max Margin svm 即Suport Vector Machine, 中文意为:支持向量机. 对于二分类问题, 在样本空间中(即便是多维向量, 在空间中可表示为一个点). svm的核心思想就是 ... 
- ML-凸优化初识
			ML问题 = 模型 + 优化 类似于, 程序 = 数据结构 + 算法 模型(objective): DL, LR, SCV, Tree, XGBoost..... 优化(train): GD/SGD, ... 
- 【C++编程基础】(1)—— 函数原型声明、函数模板、引用、const 常引用、const 常量指针
			一.函数原型声明: 1.函数声明告诉编译器函数的名称,和如何调用函数(返回类型和参数):函数定义提供了函数的实际主体. 2.强制性的:在C++中,如果函数调用的位置在函数定义之前,则要求在函数调用之前 ... 
- etcd和flannel实现docker跨物理机通信
			实验目标 跨物理机的容器之间能直接访问docker通过Flannel可以实现各容器间的相互通信,即宿主机和容器,容器和容器之间都能相互通信 实验环境 192.168.3.50 //etcd.flann ... 
- [STM32].NVIC嵌套中断向量的理解
			转自:http://www.21ic.com/embed/jiaocheng/sheji/201209/5634.html 一.STM32 (Cortex-M3) 中的优先级概念 STM32(Cort ... 
