2010-12-30 12 views
13

Python kullanarak bir kaydediciyi bir araya getirmeye çalışıyorum. 2.6'da çalışıyorum, bu yüzden yeni sözlük stili yöntemini kullanamıyorum ve eski moda yapılandırma dosyasıyla gidiyorum. Sorun şu ki, şeyler konsola iki kez çıktı ve nedenini anlayamıyorum. İşte benim test komut dosyası:Python Logger ikişer kez konsola giriş yapmak

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") 

İşte benim yapılandırma dosyası var:

[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 

Herhangi bir fikir?

cevap

37
, 0'a propagate ayarlamak için kök olmayan kaydedicileri değiştirme

kök kaydedicisi kadar yayılmasını gelen mesajları engellemek için:

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

logging modül en docs ki:

Çocuk kaydedici yaymak 'a kadar olan mesajlar, ancestor logger'larıyla ilişkili. Bu nedenle, , uygulamalarının tümünü kullanan tüm logger'lar için işleyicilerini tanımlamak ve yapılandırmak için gerekli değildir. üst düzey bir kaydedici için yapılandırma işleyicileri için yeterlidir ve gerekli olarak alt kaydediciler oluşturun.

sloggerMain günlük kaydı, root günlük kaydının bir alt öğesidir. Varsayılan olarak, o kaydediciye gönderilen iletiler de yukarı doğru yayılır.

[logger_root] 
handlers= 
:

Ayrıca sadece sorunu çözmek için kök günlüğünü devre dışı bırakabilirsiniz