Bei einem Projekt mit verschiedenen Threads ist es dringend notwendig geworden die Q&D Methode 'print' statements durch ein sauberes Logging zu ersetzen. Ist eigentlich ohne Probleme bereits erfolgt. Aber mit einem Thread wird ein Bottle Projektteil aus dem Hauptprogramm gestartet, und die Bottle logs erscheinen nicht in der log-Datei.
Das Merkwürdige ist nun folgendes:
das Bottle Teil lässt sich ohne weiteres als separates Python Programm starten (nach marginalen Änderungen) und alle logs erscheinen wo sie sollen.
Frage: Wie läßt sich das Problem einkreisen?
Da das ganze ein recht komplexes Gebilde ist, möchte ich es im Moment nicht posten. Aber sicher sind zur Unterstützung weitere Details notwendig ... welche?
Bottle/Thread und Logging
Hier die beiden logging Methoden.
1.\ das Haupt-Programm (das vorher das web/bottle Programm --siehe 2.\ -- im Thread gestartet hatte):
2.\ das Web/Bottle Program
Wie gesagt, das Python Programm 2.\ as Module geladen von 1.\ und in einem Thread gestartet:
gibt kein Looging aus!
1.\ das Haupt-Programm (das vorher das web/bottle Programm --siehe 2.\ -- im Thread gestartet hatte):
Code: Alles auswählen
LOG_FILENAME_1 = "/home/pi/logs/piSchedule.log"
LOG_FILENAME_2 = "/home/pi/logs/piSchedule_2.log"
LOG_LEVEL = logging.INFO # Could be e.g. "DEBUG" or "WARNING"
LOG_LEVEL_2 = logging.ERROR # Could be e.g. "DEBUG" or "WARNING"
logger = logging.getLogger('piSch')
logger.setLevel(logging.DEBUG)
class SingleLevelFilter(logging.Filter):
def __init__(self, passlevel, reject):
self.passlevel = passlevel
self.reject = reject
def filter(self, record):
if self.reject:
return (record.levelno != self.passlevel)
else:
return (record.levelno == self.passlevel)
# create file handler which logs even debug messages
fh = logging.FileHandler(LOG_FILENAME_1)
f1 = SingleLevelFilter(logging.INFO, False)
fh.addFilter(f1)
# create file handler with a higher log level
ch = logging.FileHandler(LOG_FILENAME_2)
f2 = SingleLevelFilter(logging.INFO, True)
ch.addFilter(f2)
# create formatter and add it to the handlers
formatter = logging.Formatter('#%(asctime).19s - %(levelname)s - %(name)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)
Code: Alles auswählen
# Defaults
LOG_FILENAME_1 = "/home/pi/logs/piSchedule.log"
LOG_FILENAME_2 = "/home/pi/logs/piSchedule_2.log"
LOG_LEVEL = logging.INFO # Could be e.g. "DEBUG" or "WARNING"
LOG_LEVEL_2 = logging.ERROR # Could be e.g. "DEBUG" or "WARNING"
logger = logging.getLogger('piWEB')
logger.setLevel(logging.DEBUG)
class SingleLevelFilter(logging.Filter):
def __init__(self, passlevel, reject):
self.passlevel = passlevel
self.reject = reject
def filter(self, record):
if self.reject:
return (record.levelno != self.passlevel)
else:
return (record.levelno == self.passlevel)
# create file handler which logs even debug messages
fh = logging.FileHandler(LOG_FILENAME_1)
f1 = SingleLevelFilter(logging.INFO, False)
fh.addFilter(f1)
# create file handler with a higher log level
ch = logging.FileHandler(LOG_FILENAME_2)
f2 = SingleLevelFilter(logging.INFO, True)
ch.addFilter(f2)
# create formatter and add it to the handlers
formatter = logging.Formatter('+%(asctime).19s + %(levelname)s + %(name)s + %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)
Code: Alles auswählen
tWeb = Thread(target=runWeb, args=(server, port)).start()
Nein, da ist nix falsches gepostet.
Ich habe zwei Python Progs -- unter 1.\ bezeichnet mit Haupt-Programm, und 2.\ das Web/Bottle Prog.
Das zweite erfordert spezielle logging Anweisungen, sonst kommt garnix. Hierfür folge ich diesem Post
http://stackoverflow.com/questions/3108 ... 9_31080214 und wenn das Progr direkt gestartet wird, dann sind die logs dort wo sie hin gehören.
Mit marginalen Änderungen habe ich es nun als Module geladen, funktioniert auch einwandfrei bis auf das Logging. Wie gesagt ... es gibt *keine* Logging Ausgabe, jedenfalls konnte ich keine finden.
Und (nur zur Vollständigkeit) das Haupt-Prog logt immer wie es soll!
Ich habe zwei Python Progs -- unter 1.\ bezeichnet mit Haupt-Programm, und 2.\ das Web/Bottle Prog.
Das zweite erfordert spezielle logging Anweisungen, sonst kommt garnix. Hierfür folge ich diesem Post
http://stackoverflow.com/questions/3108 ... 9_31080214 und wenn das Progr direkt gestartet wird, dann sind die logs dort wo sie hin gehören.
Mit marginalen Änderungen habe ich es nun als Module geladen, funktioniert auch einwandfrei bis auf das Logging. Wie gesagt ... es gibt *keine* Logging Ausgabe, jedenfalls konnte ich keine finden.
Und (nur zur Vollständigkeit) das Haupt-Prog logt immer wie es soll!
- framp
- User
- Beiträge: 52
- Registriert: Samstag 9. Oktober 2010, 22:16
- Wohnort: bei Stuttgart
- Kontaktdaten:
Versuche doch mal unterschiedliche LogDateiNamen. Ich könnte mir vorstellen, dass die Logger Klasse beim Threading ein Problem hat.
Warum erstellst Du zwei logs? Es reicht doch ein Log und per Konfiguration oder Aufrufparameter kann man den Loglevel entsprechend von ERROR bis DEBUG immer feiner einstellen.
Warum erstellst Du zwei logs? Es reicht doch ein Log und per Konfiguration oder Aufrufparameter kann man den Loglevel entsprechend von ERROR bis DEBUG immer feiner einstellen.