问题描述

问题代码如下:

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. JavaScript入门(二)

    JavaScript入门—操作DOM树 要点 DOM树是一个树形结构,操作DOM树通常是“更新.遍历.新增.删除”. 更新DOM树 拿到DOM节点 var id=document.getElement ...

  2. 彻底搞懂etcd raft选举、数据同步

    etcd raft选举机制 etcd 是一个分布式的k/V存储系统.核心使用了RAFT分布式一致性协议.一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意外可能,有的服 ...

  3. 测试欧气的小游戏-java

    Java 用我们学到的知识做处一个小的项目或者游戏等等应该都或多或少的有一点点的成就感吧,下列就是我用所学的基础知识做的猜字谜游戏,并且给他赋予了灵魂哈哈哈.有兴趣的可以尝试的用自己会的知识做一些小的 ...

  4. springboot WebMvcConfigurer配置静态资源和解决跨域

    前言 虽然现在都流行前后端分离部署,但有时候还是需要把前端文件跟后端文件一起打包发布,这就涉及到了springboot的静态资源访问的问题.不单只是静态资源打包,比如使用本地某个目录作为文件存储,也可 ...

  5. Java基础篇(下)

    6.Java面向对象的三个特征与含义 三大特征是:继承.封装和多态. (1)继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得 ...

  6. windows环境:dos 通过ftp连接到vsftpd 显示乱码解决方法

    转载至:https://blog.csdn.net/nydia_xiangxiang/article/details/48627921?utm_source=blogxgwz8 感谢原作者的分享 FT ...

  7. docker部署redis集群

    一.查询最新redis镜像 docker search redis 二.下载redis镜像 docker pull redis 三.创建一个文件夹,以及创建redis-cluster.tmpl模板文件 ...

  8. Pandas 之 DataFrame 常用操作

    import numpy as np import pandas as pd This section will walk you(引导你) through the fundamental(基本的) ...

  9. temsorflow使用笔记(自用)

    tf.argmax(input, axis=None, name=None, dimension=None) 功能:查找最大值的索引 input:数据: axis:定义按照某一条轴进行查找,如: ax ...

  10. ajax入门简介

    ajax的实现原理 ajax的定义是 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它可以在不刷新页面的情况下提交请求与服务器进行交互动作 ...