by Guest » 30 Dec 2024, 19:34
Prost!
Ich entwickle ein Django-Projekt und möchte meine Backend-Protokolle im Vordergrund anzeigen. Aus diesem Grund habe ich einen zentralen Protokollierungshandler erstellt, der Protokolle in einen Puffer schiebt. Alle 20 Sekunden sendet mein Frontend eine Anfrage, den Puffer zu leeren und die Protokollereignisse anzuzeigen.
Zentrale Protokollierungsklasse (log.py):
Code: Select all
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
Meine erste Hauptklasse ist manage.py:
Code: Select all
from mypath import log
logger = log.setup_logger(log.buffered_handler)
...
logger.info("Logs have been sent to the frontend.")
Meine zweite Hauptklasse ist generic_pictures.py (management/commands/generate_picutres.py)
Code: Select all
from another_relative_path import log
logger = log.setup_logger(log.buffered_handler)
...
logger.info("Picture has been created!")
Ich kann anscheinend nicht beide Hauptdateien dazu bringen, mit demselben Puffer im logging.handler-Objekt zu interagieren. Bei der Überprüfung der IDs jedes importierten Objekts log.buffered_handler stimmen sie nicht überein.
Was habe ich übersehen? Wie kann ich von beiden Dateien auf denselben Puffer zugreifen?
Prost!
Ich entwickle ein Django-Projekt und möchte meine Backend-Protokolle im Vordergrund anzeigen. Aus diesem Grund habe ich einen zentralen Protokollierungshandler erstellt, der Protokolle in einen Puffer schiebt. Alle 20 Sekunden sendet mein Frontend eine Anfrage, den Puffer zu leeren und die Protokollereignisse anzuzeigen.
Zentrale Protokollierungsklasse (log.py):
[code]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
[/code]
Meine erste Hauptklasse ist manage.py:
[code]from mypath import log
logger = log.setup_logger(log.buffered_handler)
...
logger.info("Logs have been sent to the frontend.")
[/code]
Meine zweite Hauptklasse ist generic_pictures.py (management/commands/generate_picutres.py)
[code]from another_relative_path import log
logger = log.setup_logger(log.buffered_handler)
...
logger.info("Picture has been created!")
[/code]
Ich kann anscheinend nicht beide Hauptdateien dazu bringen, mit demselben Puffer im logging.handler-Objekt zu interagieren. Bei der Überprüfung der IDs jedes importierten Objekts log.buffered_handler stimmen sie nicht überein.
Was habe ich übersehen? Wie kann ich von beiden Dateien auf denselben Puffer zugreifen?