Seite 1 von 1
Bottle/Thread und Logging
Verfasst: Donnerstag 2. Juli 2015, 18:34
von gNeandr
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?
Re: Bottle/Thread und Logging
Verfasst: Donnerstag 2. Juli 2015, 20:20
von Sr4l
Wie loggst du?
Benutzt du absolute Dateipfade?
Re: Bottle/Thread und Logging
Verfasst: Donnerstag 2. Juli 2015, 22:14
von gNeandr
Hier die beiden logging Methoden.
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)
2.\ das Web/Bottle Program
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)
Wie gesagt, das Python Programm 2.\ as Module geladen von 1.\ und in einem Thread gestartet:
Code: Alles auswählen
tWeb = Thread(target=runWeb, args=(server, port)).start()
gibt kein Looging aus!
Re: Bottle/Thread und Logging
Verfasst: Freitag 3. Juli 2015, 12:19
von Sr4l
Wo ist der unterschied zwischen 1. und 2.? Hast du das falsche gepostet?
Re: Bottle/Thread und Logging
Verfasst: Freitag 3. Juli 2015, 13:30
von gNeandr
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!
Re: Bottle/Thread und Logging
Verfasst: Dienstag 7. Juli 2015, 19:40
von framp
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.