logging.addLevelName() macht Probleme

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
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hi Leute,
ich plane bei meinem Script Meldungen in ein File zu schreiben. Zum einen sollen die nicht im DEBUG Level sein und auch nicht im INFO Level, also wollte ich ein neues Level erstellen was ich WRITER nenne.

Leider funktioniert mein Code nicht. Er sagt das er das neue WRITER Modul nicht kennt.

Code: Alles auswählen

import logging
import sys
log1 = logging.getLogger('mondo')
log1.setLevel(logging.INFO)
h=logging.FileHandler('mondo.log')
f=logging.Formatter('%(levelname)-8s %(name)-12s %(asctime)s %(message)s')
h.setFormatter(f)
log1.addHandler(h)
log1.info('test test 1 2 3')
log1.warning('test test')

log1.debug('debugmessage')


logging.addLevelName(11,'WRITER')

print str(logging.getLevelName(11))
logwriter = logging.FileHandler('writer.log')
logwriter.setLevel(logging.WRITER)
logwriter.setFormatter(f)

log1.addHandler(logwriter)
Was mache ich verkehrt? Selbst getLevelName gibt mir 'WRITER' zurück...
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

[quote="würmchen"]

Code: Alles auswählen

logwriter.setLevel(logging.WRITER)
Naja, das logging-Modul hat halt keiine Variable namens "WRITER". So geht's:

Code: Alles auswählen

logwriter.setLevel(11)
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Ok, hatte ich auch versucht, mich nur gewundert, dachte ich würde das mit dem String auch irgendwie direkt setzen. Aber der String scheint nur für den Output später zu sein...

Danke...
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hm, ok, irgendwie scheint das nicht so ganz zu funktionieren wie ich mir das vorstelle..... Ich bekomme keine Meldung in der Datei writer.log
Und ich lese immer nur das er die Meldungen mit dem gleichen Level oder höher dann an diesen Handler übergibt, kann ich auch einen Handler bestimmen der andere Messages wieder verwirft? Also zb nur INFO logged aber kein WARN usw.

Code: Alles auswählen

import logging
import sys
log1 = logging.getLogger('mondo')
log1.setLevel(logging.INFO)
h=logging.FileHandler('mondo.log')
f=logging.Formatter('%(levelname)-8s %(name)-12s %(asctime)s %(message)s')
h.setFormatter(f)
log1.addHandler(h)
log1.info('test test 1 2 3')
log1.warning('test test')

log1.debug('debugmessage')


logging.addLevelName(11,'WRITER')

logwriter = logging.FileHandler('writer.log')
logwriter.setLevel(11)
logwriter.setFormatter(f)

log1.addHandler(logwriter)


log1.log(11,'test')
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Was genau moechtest du denn erreichen? Das wird mir aus deinem Code nicht klar.

Das mit dem neuen Loglevel funktioniert jedenfalls so:

Code: Alles auswählen

import logging

WRITER=11
logging.addLevelName(WRITER,'WRITER')
logging.basicConfig(level=WRITER)
logging.log(WRITER,'test') 
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Naja, ich will verschiedene Logfiles schreiben.
Einmal eins in dem ich NUR INFOS ausgeben will
Ein zweites, in dem ich DEBUG und den rest ausgeben will, aber nicht die INFOS von der Datei davor.

Bei dem Code oben hab ich nur versucht einen eigenen Handler zu finden, der eben NUR bestimmte Infos in eine bestimmte Datei schreibt und eben nicht alle Infos über dem genannten Loglevel.

warum kann ich denn nicht einem bestimmten Handler ein Level hinzufügen? Du bestimmst ja den root logger mit level WRITER? Oder?
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hab im Internet noch ein wenig nach Lösungen gesucht, wenn ich ein Filter zu dem Logger hinzufüge, sollte es ja gehen. Hab im Netz das Beispiel gefunden, aber das scheint auch nicht zu funktionieren, überseh ich etwas?

Code: Alles auswählen

import logging

class InfoFilter(logging.Filter):
    def __init__(self, level):
        self.level = level
    def filter(self, record):
        return self.level == record.levelno

if __name__ == "__main__":
        logger = logging.getLogger()
        hdlr = logging.FileHandler("blah.log")
        hdlr.addFilter(InfoFilter(20))
        logger.addHandler(hdlr)

        logger.exception("ERROR WILL ROBINSON") #sollte nicht geschrieben werden
        logger.log(20,'test') #sollte in das file geschrieben werden
        logger.info('test') #sollte in das file geschrieben werden
        print str(logging.INFO) #gibt das Level, also 20 aus
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

würmchen hat geschrieben:Hab im Internet noch ein wenig nach Lösungen gesucht, wenn ich ein Filter zu dem Logger hinzufüge, sollte es ja gehen. Hab im Netz das Beispiel gefunden, aber das scheint auch nicht zu funktionieren, überseh ich etwas?
Ok, hab den Fehler Gefunden, ich hätte wohl vorher noch ein loglefel zuweisen müssen.

Code: Alles auswählen

import logging

class InfoFilter(logging.Filter):
    def __init__(self, level):
        self.level = level
    def filter(self, record):
        return self.level == record.levelno

if __name__ == "__main__":
        logger = logging.getLogger()
        hdlr = logging.FileHandler("blah.log")
        logger.setLevel(20)
        logger.addFilter(InfoFilter(20))
        logger.addHandler(hdlr)

        logger.exception("ERROR WILL ROBINSON") #sollte nicht geschrieben werden
        logger.log(20,'test') #sollte in das file geschrieben werden
        logger.info('test') #sollte in das file geschrieben werden
        print str(logging.INFO) #gibt das Level, also 20 aus
Antworten