2016-07-21 3 views
0

Ich habe einen Logger eingerichtet mit zwei Handlern - einen zur Konsole und einen eine rotierte Datei. Ich setze jeden einzelnen Handler mit seinem eigenen Loglevel. Die Idee ist, dass wichtige Nachrichten auf der Konsole verfügbar sind, während die unteren Ebenen der Datei in die Datei gehen, falls ich eine weitere Fehlersuche durchführen muss.Kann ich die Protokollstufe eines einzelnen Handlers in Python dynamisch ändern?

Meine Konfigurationsdatei sieht wie folgt aus:

[loggers] 
keys=root 

[handlers] 
keys=consoleHandler,rotateFileHandler 

[formatters] 
keys=simpleFormatter 

[logger_root] 
level=DEBUG 
handlers=consoleHandler,rotateFileHandler 
qualname=MyApplication 
propagate=0 

[handler_consoleHandler] 
class=StreamHandler 
level=ERROR 
formatter=simpleFormatter 
args=(sys.stdout,) 

[handler_rotateFileHandler] 
class=handlers.RotatingFileHandler 
level=INFO 
formatter=simpleFormatter 
args=('TESTLOG.log', 'a', 100000, 5, 'utf8') 

[formatter_simpleFormatter] 
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt= 

Gibt es eine Möglichkeit (und dann zurücksetzen), um dynamisch zu ändern, um die Protokollebene für einen einzelnen Handler? Ich habe versucht, dies zu tun, aber es schlägt fehl, weil logger ist, nun, der Logger und nicht der Handler. Es ist auch bereits auf DEBUG gesetzt, es sind die Handler, die auf höheren Ebenen eingestellt sind.

import logging 
import logging.config 

logging.config.fileConfig('logging.config', disable_existing_loggers=False) 
logger = logging.getLogger('TestLog') 

def main(): 
    logger.debug('debug message') 
    logger.info('info message') 
    logger.warn('warn message') 
    logger.error('error message') 
    logger.critical('critical message') 
    # Reset log level to debug temporarily 
    logger.setLevel(logging.DEBUG) 
    logger.debug('This message appears if level was reset to DEBUG') 

if __name__ == '__main__': 
    main() 

Mein Ziel ist es, die Konsole auf ein niedrigeres Niveau in der Lage sein zu setzen (dh. logging.DEBUG für einen bestimmten Zeitraum und dann wieder ändern, indem Sie entweder das vorherige Niveau sichern, bevor die Änderung ausgeführt wird oder explizit Zurücksetzen es). Ich möchte die anderen Handler nicht berühren, wenn ich das tue.

Wie ändere ich die Handler Log-Level dynamisch?

+0

Für den Abschnitt "logger_root" wird das Feld "qualname" vollständig ignoriert. Es hat keinen Sinn, sie festzulegen. –

Antwort

2

Sie müssten die spezifischen Handler zu durchqueren:

console_handler = logging.getLogger().handlers[0] 
old_level = console_handler.level 
console_handler.setLevel(logging.DEBUG) 

Der Index entspricht der Reihenfolge von der handlers in Ihrem Logging-Konfiguration (alle vorherigen Handler auf einem bestimmten Logger gelöscht wetzen die Config geladen wird) .

+0

Passt der Index immer zu der im '[handlers]' Block der Konfigurationsdatei definierten Reihenfolge? In meinem Fall 'keys = consoleHandler, rotateFileHandler' also,' .handlers [0] 'wird immer der consoleHandler sein? – NewGuy

+0

@NewGuy: nicht der Block '[handlers]'; Die Reihenfolge wird durch das Feld 'handlers =' in einem gegebenen Abschnitt 'logger_ *' festgelegt. –