Bottle/Thread und Logging

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
gNeandr
User
Beiträge: 68
Registriert: Sonntag 11. Mai 2014, 16:48

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?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Wie loggst du?

Benutzt du absolute Dateipfade?
gNeandr
User
Beiträge: 68
Registriert: Sonntag 11. Mai 2014, 16:48

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!
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Wo ist der unterschied zwischen 1. und 2.? Hast du das falsche gepostet?
gNeandr
User
Beiträge: 68
Registriert: Sonntag 11. Mai 2014, 16:48

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!
Benutzeravatar
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.
Antworten