Seite 1 von 1

logging.addLevelName() macht Probleme

Verfasst: Dienstag 2. September 2008, 12:30
von würmchen
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...

Re: logging.addLevelName() macht Probleme

Verfasst: Dienstag 2. September 2008, 12:42
von Rebecca
[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)

Verfasst: Dienstag 2. September 2008, 13:02
von würmchen
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...

Verfasst: Dienstag 2. September 2008, 13:46
von würmchen
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')

Verfasst: Dienstag 2. September 2008, 14:28
von Rebecca
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') 

Verfasst: Dienstag 2. September 2008, 14:38
von würmchen
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?

Verfasst: Dienstag 2. September 2008, 15:29
von würmchen
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

Verfasst: Dienstag 2. September 2008, 16:03
von würmchen
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