2011-11-25 15 views
10

Python günlüğe kaydetme modülünü şu andaki kurulumla basit bir komut dosyasında kullanıyorum.Python yalnızca günlük dosyasından günlüğe kaydediliyor

logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') 
logger = logging.getLogger(__name__) 

Sorunum, bu durumun istekleri ve çıkış bilgileri() günlük iletileri gibi üçüncü taraf modüllerini de yakalamasıdır. Bu mesajları bastırmanın veya günlüğe kaydetme modülünün sadece kendi komutumdan iletileri günlüğe kaydetmesini söylemenin bir yolu var mı? senin modüllerde adlandırılmış kaydedicileri kullanma

cevap

10

:

import logging 
logger = logging.getLogger(__name__) 
logger.info("my info") 
logger.error("my error") 

Eğer hata tüm diğer kaydediciler için ve hata ayıklama için kaydedicilerinin için günlük düzeyini ayarlayabilirsiniz:

import logging 
logging.basicConfig(level=logging.ERROR) 
logging.getLogger(my_module.__name__).setLevel(logging.DEBUG) 
0

yukarıdaki çözüm değildir gerçekten doğru - sadece diğer modüllerdeki mesajların gösterilmesi için çubuğu daha yükseğe ayarlayacaktır. Bu noktaya kadar oluşturulan tüm kaydedicileri devre dışı bırakır -

import logging.config 
logging.config.dictConfig({ 
    'version': 1, 
    'disable_existing_loggers': True, 
}) 

Tüm modülleri ithal sonra bu belirlemek zorunda:

çok hızlı bir yaklaşım Bu kod parçasını kullanmak olacaktır. Bu çoğu zaman işe yarayacaktır, ancak bazı modüller (örneğin kodunuzda daha sonra gerçekleşecek) bir sınıf örneği oluşturduğunuzda kaydedicilerini oluşturur. Eğer logging.basicConfig(...) kullanmak onlar size temel piton öğretici göre loggers kurmak


. Bu işlem, işleyiciyi (günlüğün nereye yönlendirileceği) logging.lastResort'a ayarlayacağı için bir sorun yaratmaktadır. Bu işlem, süreçte global olarak tüm kaydedicilerinin için Python 3.2 ile başlamasıdır. Bu, artık tüm modüller için tam oturum açmayı etkinleştirdiğiniz anlamına gelir.

Daha iyi bir yaklaşım, yalnızca modülleriniz için farklı bir günlük kaydedici oluşturmak ve basicConfig()'u kullanmak yerine kendisine bazı işleyicileri vermek. Bunu yapmanın iki yolu vardır

:

1) Tüm fonksiyonu:

import logging 

log = logging.getLogger(__name__) 
log.setLevel(logging.DEBUG) 
formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s", 
          datefmt="%Y-%m-%d - %H:%M:%S") 
ch = logging.StreamHandler(sys.stdout) 
ch.setLevel(logging.DEBUG) 
ch.setFormatter(formatter) 
fh = logging.FileHandler("mylog.log", "w") 
fh.setLevel(logging.DEBUG) 
fh.setFormatter(formatter) 
log.addHandler(ch) 
log.addHandler(fh) 

Bu size daha sonra log.error("Error found") gibi kullanabilirsiniz logger log verecektir. Bu, mylog.log adında yeni bir dosyaya yazacak ve aynı zamanda sys.stdout dosyasını da kaydedecektir. Bunu istediğin gibi değiştirebilirsin. Bir dicti kullanma

2):

import logging 
import logging.config 

DEFAULT_LOGGING = { 
    'version': 1, 
    'formatters': { 
     'standard': { 
      'format': '%(asctime)s %(levelname)s: %(message)s', 
      'datefmt': '%Y-%m-%d - %H:%M:%S' }, 
    }, 
    'handlers': { 
     'console': {'class': 'logging.StreamHandler', 
        'formatter': "standard", 
        'level': 'DEBUG', 
        'stream': sys.stdout}, 
     'file':  {'class': 'logging.FileHandler', 
        'formatter': "standard", 
        'level': 'DEBUG', 
        'filename': 'live_detector.log','mode': 'w'} 
    }, 
    'loggers': { 
     __name__: {'level': 'INFO', 
        'handlers': ['console', 'file'], 
        'propagate': False }, 
    } 
} 

logging.config.dictConfig(DEFAULT_LOGGING) 
log = logging.getLogger(__name__) 

Bu biraz daha uzun, yukarıdaki gibi aynı sonucu verir, ancak okumak belki daha kolay olacaktır. Bu otomatik olarak 'disable_existing_loggers': True'u da ayarlayacaktır. Bunu istemezseniz, onu eklemeniz ve False olarak ayarlamanız gerekir.

İlgili konular