Получение двойных логов в python logger - код имеет циклические зависимости - PullRequest
0 голосов
/ 19 февраля 2019

Я получаю дублирующиеся (двойные) журналы при использовании регистрации в python.У меня есть 3 файла:

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

Я делаю только 1 вызов конструктора Python Logger, который выполняется внутри main.py

Ниже приведены мои операторы импорта в 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 в main.py, У меня есть импорт

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 голосов
/ 19 февраля 2019

Лесозаготовка - сквозная проблема.Таким образом, я нахмурился на классы, которые настраивают регистрацию самостоятельно.Ответственность за настройку ведения журнала (особенно обработчиков) должна лежать исключительно на основной исполняющей функции, например, на вашей основной функции.Никакой подмодуль / класс / функция не должен изменять журналирование, кроме получения регистратора через logging.getlogger ( name ).Это позволяет избежать большинства из этих ловушек и позволяет легко составлять модули.Представьте, что вам нужно импортировать два модуля, которые модифицируют систему ведения журнала ... fun

0 голосов
/ 19 февраля 2019

Я предполагаю, что существуют два объекта CraftLogger, и оба имеют одинаковый член self.logger.logging.getLogger(__name__), вероятно, возвращает тот же объект для другого CraftLogger объекта, что приводит к двум addHandler вызовам одного и того же регистратора.Это всего лишь предположение, без гарантии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...