2011-07-18 11 views
36

Python günlüğünü kullanıyorum ve nedense tüm iletilerim iki kez görünüyor. Daha sonraPython Günlüğü ile iki kez görüntülenen günlük iletileri

# BUG: It's outputting logging messages twice - not sure why - it's not the propagate setting. 
def configure_logging(self, logging_file): 
    self.logger = logging.getLogger("my_logger") 
    self.logger.setLevel(logging.DEBUG) 
    self.logger.propagate = 0 
    # Format for our loglines 
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") 
    # Setup console logging 
    ch = logging.StreamHandler() 
    ch.setLevel(logging.DEBUG) 
    ch.setFormatter(formatter) 
    self.logger.addHandler(ch) 
    # Setup file logging as well 
    fh = logging.FileHandler(LOG_FILENAME) 
    fh.setLevel(logging.DEBUG) 
    fh.setFormatter(formatter) 
    self.logger.addHandler(fh) 

, ben günlüğü yapılandırmak için bu yöntem çağırır:

if __name__ == '__main__': 
    tom = Boy() 
    tom.configure_logging(LOG_FILENAME) 
    tom.buy_ham() 

Sonra diyelim ki içinde, buy_ham modülü, ben derim

Ben günlüğü yapılandırmak için bir modül var :

Bazı nedenlerden dolayı, tüm iletiler iki kez görünür. Akış işleyicilerinden birini, yine aynı şeyi açıkladım. Garip olan bir bit, bunun neden olduğuna emin değilim ... lol. Anlaşılan belli bir şeyi kaçırdım.

Alkış, Victor

iki kez (belki Boy arasında __init__ yönteminde) configure_logging aradığınız
+0

'configure_logging()' öğesinin iki kez çağrılmadığından emin misiniz (örn. kurucudan da)? Boy() yalnızca bir örneğini oluşturdu mu? –

cevap

60

: getLogger aynı nesneyi döndürür, ancak benzer bir işleyici zaten günlükçüsüne eklenmişse addHandler kontrol etmez .

Aramaları bu yönteme göre izlemeyi ve bunlardan birini ortadan kaldırmayı deneyin. Veya Boy arasında __init__ yönteminde False için başlatıldı bir bayrak logging_initialized kurmak ve logging_initializedTrue ise hiçbir şey yapmamak configure_logging değiştirmek ve logger başlatıldı sonra True bunu ayarlamak için. Programınız birkaç Boy örneklerini oluşturursa

, size işleyicileri ekleyerek global configure_logging fonksiyonlu şeyler yapmak şeklini değiştirmek gerekir ve Boy.configure_logging yöntem yalnızca self.logger niteliğini başlatılıyor.

bu çözümü bir başka yolu işleyicileri senin kaydedicisi özelliğini kontrol etmektir:

logger = logging.getLogger('my_logger') 
if not logger.handlers: 
    # create the handlers and call logger.addHandler(logging_handler) 
+1

Evet, haklıydın - aptal ben. Ben __init__, yanı sıra açıkça başka bir yerde aradım. Lol. Teşekkürler =). – victorhooi

+0

Teşekkürler. Çözümün beni bugün kurtardı. – Tammy

+1

Benim durumumda, 6 kez gözüküyorlardı. Şüphelenmiştim çünkü 6 oop sınıfında – answerSeeker

5

işleyicisi dışından aramanız her zaman eklenir. İşinizi bitirdikten sonra İşleyici uzaklaştırmanın deneyin: Bir piton çaylak değilim

self.logger.removeHandler(ch) 
+0

Ben python 2.7 'logger.handlers.pop() 'kullandım, hile yapar – radtek

2

, ama bu benim için iş gibi görünüyordu (Python 2,7)

while logger.handlers: 
    logger.handlers.pop() 
1

Bu sorunla görüyorsanız ve iki kez işleyicisi ekleyerek değil misin sonra docs itibaren abarnert cevabı here

bkz:

Not: Bir kaydediciye ve atalarının bir veya daha fazlasına bir işleyici eklerseniz, aynı kaydı birden çok kez verebilir. Genel olarak, , bir işleyiciyi birden fazla kaydediciye eklemeniz gerekmeyecektir - , günlüğü hiyerarşisinde en yüksek uygun kaydediciye takarsanız, tüm ayıklar kaydediciler tarafından günlüğe kaydedilir. yayılma ayarlarının True olarak ayarlanmış olması koşuluyla.Bir ortak senaryosu, işleyicileri yalnızca kök günlüğüne bağlamak ve geri kalanın yayılımını sağlamak için izin vermektir. Eğer "test" ile ilgili özel bir işleyici istiyorsanız ve onun mesajlar da kök işleyicisi olacak istemiyorsanız

Yani, cevabı basit:

logger: onun Propagate bayrağını kapatmak .propagate = False