Ich verwende das folgende Modul, um Ereignisse in meinen Modulen zu protokollieren. Ich nenne es wie folgt:Verwenden von Python-Protokollierung von mehreren Modulen mit dem Schreiben in eine Datei und RotatingFileHandler
Modul 1
from tools.debug_logger import debug_logger
self.logger = debug_logger().start_logger('module1')
self.logger.debug("Top left corner found")
module2:
from tools.debug_logger import debug_logger
self.logger = debug_logger().start_logger('module2')
self.logger.debug("Top left corner found")
und hier die Datei /tools/debug_logger.py
import logging, logging.handlers
import sys
class debug_logger(object):
def start_logger(self,name):
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
if not len(logger.handlers):
fh = logging.handlers.RotatingFileHandler('log/pokerprogram.log', maxBytes=1000000, backupCount=10)
fh.setLevel(logging.DEBUG)
fh2 = logging.handlers.RotatingFileHandler('log/pokerprogram_info_only.log', maxBytes=1000000, backupCount=5)
fh2.setLevel(logging.INFO)
er = logging.handlers.RotatingFileHandler('log/errors.log', maxBytes=2000000, backupCount=2)
er.setLevel(logging.WARNING)
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(1)
fh.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
fh2.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
er.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
ch.setFormatter(logging.Formatter('%(name)s - %(levelname)s - %(message)s'))
logger.addHandler(fh)
logger.addHandler(fh2)
logger.addHandler(ch)
logger.addHandler(er)
return logger
Alles funktioniert gut und ich Log-Dateien für die jeweiligen Ebenen abrufen, aber wenn der RotatingFileHandler aufgerufen wird, erhalte ich manchmal einen Fehler. Es ist, als ob verschiedene Instanzen gleichzeitig die Rotation durchführen möchten, obwohl ich mir ziemlich sicher bin, dass dies nicht passieren sollte, da ich sicherstelle, dass es nur 1 Handler mit if not len(logger.handlers)
gibt, wie hier empfohlen: Duplicate log output when using Python logging module.
Jeder Vorschlag, der diese Dateizugriffsverletzung während der Rotation verursachen könnte, wäre willkommen.
Ich glaube, dass der Erlaubnisfehler auftritt, weil, wenn die Umdrehung auftritt, andere Module noch in die Akte schreiben.
Was wäre der beste Weg, Logging von mehreren Modulen zu machen, wenn ich in eine Datei schreibe und diesen RotatingFileHandler verwende? Gibt es Best Practices?
Sie tun es falsch. Ihre Module sollten * keine * Handler definieren oder die Protokollierungsstufen festlegen. Nur die Haupt-Executable sollte die Handler und die zu verwendenden Level einrichten ... das vereinfacht alles, da nach dem Ausführen immer nur ein Handler für diese Datei existiert und es keine Chance gibt, dass dieser Fehler auftritt. – Bakuriu
Die mit 'wenn nicht len (logger.handlers):' Ich stelle sicher, dass es nur 1 Handler gibt. Was ist ein besserer Weg, dies zu tun? – Nickpick
Nein, tust du nicht. Weil module1 und module2 unterschiedliche Namen haben, was bedeutet, dass die Logger, die von 'getLogger' zurückgegeben werden, unterschiedlich sind und daher fügen Sie einen Handler für module1 und einen für module2 hinzu. So, sicher, dass ein einzelner Logger nicht mehr als einen Handler hat, aber Sie * haben * zwei Handler, die dieselbe Datei verwenden, und dies verursacht den Fehler, den Sie sehen. – Bakuriu