2016-03-31 3 views
3

Mit der Bibliothek logging können Sie sich in einer Datei anmelden. Sie müssen die Protokollebene für den Dateihandler festlegen. Jedes Protokoll mit einem Level, das gleich oder höher als das angegebene Level ist, wird in der Datei protokolliert.Protokollierung: Festlegen einer maximalen Protokollstufe für einen Handler

Aber was, wenn ich will Fehler und Ausnahmen in einer Datei myapp_errors.log, Infos auf eine andere Datei myapp_info.log und jedem anderen Protokoll auf eine andere Datei myapp_debug.log anmelden? Die einzige Option besteht darin, drei Logger zu erstellen?

Antwort

3

Sie können Filter zu Dateihandlern hinzufügen. Auf diese Weise können Sie bestimmte Ebenen in verschiedene Dateien umleiten.

import logging 

class LevelFilter(logging.Filter): 
    def __init__(self, low, high): 
     self._low = low 
     self._high = high 
     logging.Filter.__init__(self) 
    def filter(self, record): 
     if self._low <= record.levelno <= self._high: 
      return True 
     return False 


logging.basicConfig(level=logging.DEBUG) 

log = logging.getLogger('foo') 
error_handler = logging.FileHandler('error.log', 'a') 
error_handler.addFilter(LevelFilter(40, 40)) 
warn_handler = logging.FileHandler('warn.log', 'a') 
warn_handler.addFilter(LevelFilter(30, 30)) 
log.addHandler(error_handler) 
log.addHandler(warn_handler) 

log.debug('debug') 
log.info('info') 
log.warn('warn') 
log.error('error') 

Warnungen werden zu warn.log gehen, Fehler zu error.log. Alle anderen Ebenen werden nicht in einer Datei gespeichert.

Beispiel:

$ python log.py 
DEBUG:foo:debug 
INFO:foo:info 
WARNING:foo:warn 
ERROR:foo:error 
$ tail -n +1 *.log 
==> error.log <== 
error 

==> warn.log <== 
warn 
+0

Ich führe den Code aus. Beide Dateien haben alle Protokolle. –

+0

Woops gibt es einen Tippfehler. Es sollte überhaupt nicht laufen :) Können Sie es erneut versuchen? Es funktioniert für mich – Schore

+0

Das ist seltsam, wenn ich es in ipython notebok es funktioniert nicht ausführen, aber von der Befehlszeile funktioniert es. –

1

Sie sollten sich die python documentation ansehen. Die Verwendung mehrerer Logger scheint der empfohlene Weg zu sein.

+2

logging.disable (lvl) hilfreich sein könnten verschiedene Ebenen aufgeteilt – Schore

+0

Nun, das Beispiel, das Sie fügt dem gleichen Logger einen anderen Handler berichtet, dem Stammlogger. Die anderen Logger werden nur für unterschiedliche Signalbereiche verwendet. @Schore: 'logging.disable (lvl)' deaktiviert nicht alle Logs mit Level gleich oder niedriger als lvl? Ich brauche etwas, das für höhere Ebenen und für einen bestimmten Handler deaktiviert ist. –

Verwandte Themen