在python logger中获取双重日志 - 代码具有循环依赖性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在python logger中获取双重日志 - 代码具有循环依赖性相关的知识,希望对你有一定的参考价值。

使用python日志记录时,我得到重复(双)日志。我有3个文件:

         1. main.py
         2. dependencies.py
         3. resources.py

我只调用了一个python logger构造函数,它在main.py中完成

以下是我在3个文件中的import语句

卖弄.朋友

import xml.etree.ElementTree as et

from configparser import ConfigParser
from Craftlogger import Craftlogger

logger = Craftlogger().getLogger()

dependencies.朋友

import os,sys

from main import getJobDetails,postRequest,logger
from configparser import ConfigParser

resources.朋友

import os,sys
import xml.etree.ElementTree as et

在main.py的main方法中,我有导入

def main():

    from resources import getResourceDetails,setResources
    from dependencies import setDependencies


    ..... Remaining code .....


我的日志文件看起来像这样

import logging

class Craftlogger:

    def __init__(self):
        self.logger = logging.getLogger(__name__)
        handler = logging.StreamHandler()
        formatter_string = '%(asctime)s | %(levelname)-8s | %(filename)s-%(funcName)s-%(lineno)04d | %(message)s'
        formatter = logging.Formatter(formatter_string)
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)
        self.logger.setLevel(logging.DEBUG)
        self.logger.propagate = False


    def getLogger(self):
        return self.logger

注意:我必须在main内部进行导入,以便能够进行循环导入。

答案

我的猜测是存在两个CraftLogger对象并且都具有相同的self.logger成员。 logging.getLogger(__name__)可能为另一个CraftLogger对象返回相同的对象,导致在同一记录器上进行两次addHandler调用。这只是猜测,不能保证。

另一答案

记录是一个跨领域的问题。因此,我对自己设置日志记录的课程不屑一顾。配置日志记录(尤其是处理程序)的责任应该仅与主执行功能有关,例如你的主要功能。除了通过logging.getlogger(name)获取记录器之外,没有子模块/类/函数应该修改日志记录。这避免了大多数这些陷阱并且允许容易地组合模块。想象一下,你必须导入两个修改日志记录系统的模块......好玩

以上是关于在python logger中获取双重日志 - 代码具有循环依赖性的主要内容,如果未能解决你的问题,请参考以下文章

Python:Logging日志处理

flask中logger日志的使用

python logger日志通用配置文件

Python日志处理

Python的日志系统

Python日志模块介绍