在python记录器中获取双日志-代码具有循环依赖性

时间:2019-02-19 08:56:19

标签: python python-3.x logging

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

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

我仅对main.py内部完成的python logger构造函数进行一次调用

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

main.py

import xml.etree.ElementTree as et

from configparser import ConfigParser
from Craftlogger import Craftlogger

logger = Craftlogger().getLogger()

dependencies.py

import os,sys

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

resources.py

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内部进行导入,以便能够进行循环导入。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

记录是一个跨领域的问题。因此,我不赞成自己设置日志的类。配置日志记录(尤其是处理程序)的责任应完全由主要执行功能负责,例如您的主要功能。除了通过logging.getlogger( name )获取记录器外,任何子模块/类/函数都不应修改记录。 这样可以避免大多数此类陷阱,并可以轻松组成模块。 假设您必须导入两个都修改日志记录系统的模块...乐趣