Используйте один и тот же logging.Handler в разных основных файлах

«Будьте здоровы!»

Я разрабатываю проект на Django и хочу отображать логи бэкенда на форентеде. Для этого я создал центральный обработчик логов, который сбрасывает логи в буфер. Каждые 20 секунд мой фронтенд посылает запрос на промывку буфера и отображение событий журнала.

Класс централизованного ведения журнала (log.py):

import logging

class BufferedLogHandler(logging.Handler):
    def __init__(self):
        super().__init__()
        self.log_buffer = []  # Lokaler Puffer für Logs

    def emit(self, record):
        log_entry = self.format(record)  # Format den Log-Eintrag
        self.log_buffer.append(log_entry)
    
    def create_external_log(self, level=None, timestamp=None, message=None):
        asctime = timestamp
        msg = message
        record = logging.LogRecord(
                        level=level,   
                        msg=msg, 
                        asctime=asctime,
                        lineno=0,
                        exc_info=None,
                        args=None,
                        name= None,
                        pathname="frontend",
                    )
        self.emit(record=record)
        return BufferedLogHandler.create_empty_response()

    def flush_buffer(self):
        logs_to_send = self.log_buffer[:]
        print(f'logs_to_send:{logs_to_send}')
        print("---------------------")
        self.log_buffer = []
        return logs_to_send
    
    @staticmethod
    def create_empty_response():
        response = {'message':""}
        return response
    
buffered_handler = BufferedLogHandler()


def setup_logger(bufferedHandler):
    # Den Logger holen (Root-Logger oder benannten Logger)
    logger = logging.getLogger()  # Du kannst auch den Root-Logger verwenden

    # Setze das Log-Level (z.B. DEBUG, INFO)
    logger.setLevel(logging.DEBUG)

    # Erstelle einen Handler (z.B. für Konsole oder Datei)
    file_handler = logging.FileHandler('myapp.log')  # Für eine Log-Datei

    # Erstelle ein Format für die Log-Nachrichten
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(lineno)d - %(message)s')

    # Setze das Format für beide Handler
    bufferedHandler.setFormatter(formatter)
    file_handler.setFormatter(formatter)

    # Füge beide Handler dem Logger hinzu
    logger.addHandler(buffered_handler)
    logger.addHandler(file_handler)

    return logger

Мой первый основной класс - manage.py:

from mypath import log
logger = log.setup_logger(log.buffered_handler)
...
logger.info("Logs have been sent to the frontend.")

Второй мой основной класс - generate_pictures.py (management/commands/generate_picutres.py)

from another_relative_path import log
logger = log.setup_logger(log.buffered_handler)
...
logger.info("Picture has been created!")

Не удается заставить оба основных файла взаимодействовать с одним и тем же буфером в объекте logging.handler. При проверке идентификаторов каждого импортированного объекта log.buffered_handler они не совпадают.

Что я упустил? Как я могу получить доступ к одному и тому же буферу из обоих файлов?

Если вы хотите иметь общий логгер во всех ваших модулях, вам следует создать его в одном месте.

Я бы сделал это место вашим log.py файлом. В конце его создайте логгер:

logger = setup_logger(buffered_handler)

и затем в других модулях импортируйте его с помощью

from mypath.log import logger

, которые вы можете использовать напрямую.

Вернуться на верх