2010-12-30 11 views
13

Sto provando a mettere insieme un logger usando Python. Sto lavorando in 2.6 quindi non posso usare il nuovo metodo di stile del dizionario e invece sto andando con il buon vecchio file di configurazione. Il problema è che roba uscite due volte alla console e non riesco a capire perché. Ecco il mio script di test:Logger di Python che registra le cose due volte in console

import logging 
import logging.config 

if __name__ == "__main__": 
    logging.config.fileConfig("newSlogger.conf") 
    slogger = logging.getLogger("sloggerMain") 

    slogger.debug("dbg msg") 
    slogger.info("herp derp dominae") 

Ecco il mio file di configurazione:

[loggers] 
keys=root,sloggerMain,sloggerSecondary 

[handlers] 
keys=consoleHandler,infoFileHandler,debugFileHandler 

[formatters] 
keys=consoleFormatter,infoFileFormatter,debugFileFormatter 

[logger_root] 
handlers=consoleHandler 
level=NOTSET 

[logger_sloggerMain] 
handlers=consoleHandler,infoFileHandler,debugFileHandler 
level=DEBUG 
qualname=sloggerMain 

[logger_sloggerSecondary] 
handlers=consoleHandler,infoFileHandler,debugFileHandler 
level=DEBUG 
qualname=sloggerSecondary 

[handler_consoleHandler] 
class=StreamHandler 
level=DEBUG 
format=consoleFormatter 
args=(sys.stdout,) 

[handler_infoFileHandler] 
class=FileHandler 
level=INFO 
formatter=infoFileFormatter 
args=("testlog.log", "w") 

[handler_debugFileHandler] 
class=FileHandler 
level=DEBUG 
formatter=debugFileFormatter 
args=("testlogdbg.log", "w") 

[formatter_consoleFormatter] 
format=%(name)s: %(asctime)s %(levelname)s %(message)s 
datefmt=%Y-%m-%d %H:%M:%S 

[formatter_infoFileFormatter] 
format=%(name)s: %(asctime)s %(levelname)s %(message)s 
datefmt=%Y-%m-%d %H:%M:%S 

[formatter_debugFileFormatter] 
format=%(name)s: %(asctime)s %(levelname)s %(message)s 
datefmt=%Y-%m-%d %H:%M:%S 

[formatter_syslogFormatter] 
format=%(name)s: %(asctime)s %(levelname)s %(message)s 
datefmt=%Y-%m-%d %H:%M:%S 

Tutte le idee?

risposta

37

Cambia i tuoi logger non-root per impostare propagate-0, per evitare che i messaggi vengano propagate fino al logger principale:

[logger_sloggerMain] 
handlers=consoleHandler,infoFileHandler,debugFileHandler 
level=DEBUG 
qualname=sloggerMain 
propagate=0 

Il modulo del docslogging dire:

logger Bambino propagano messaggi fino a i gestori associati ai loro logger antenati . Per questo motivo, non è necessario definire per configurare e configurare i gestori per tutti i logger e gli usi dell'applicazione . È sufficiente che configuri i gestori per un logger di livello superiore e crei i logger figlio come necessari.

Il programma di registrazione sloggerMain è un figlio del logger root. Per impostazione predefinita, i messaggi emessi nel registratore vengono propagati anche verso l'alto.

Si può anche semplicemente disattivare la registrazione della radice per risolvere il problema:

[logger_root] 
handlers= 
Problemi correlati