2016-04-07 10 views
0

Burada belirtildiği gibi https://stackoverflow.com/a/4150322/1526342. Çocuk kaydediciye giriş yaparken, iletiyi üst öğeye iletir ve üst klasörü iletiyi kök günlüğüne geçirir. ŞimdiPython alt kaydedicisi, kendi günlük yapılandırmalarını uygulamak yerine kök günlüğüne geri rapor vermelidir

import logging 
import logging.handlers 
child_logger = logging.getLogger(__name__) 
f = logging.Formatter(
     fmt='%(asctime)s; %(name)s; % (filename)s:%(lineno)d:%(message)s', 
     datefmt="%Y-%m-%d %H:%M:%S") 
handler = logging.handlers.RotatingFileHandler('/tmp/info.log', 
               encoding='utf8', 
               maxBytes=500000000, 
               backupCount=5) 
handler.setFormatter(f) 
child_logger.setLevel(logging.INFO) 
child_logger.addHandler(handler) 
child_logger.info('1 + 1 is %d', 1+1) 

child_logger geri kök günlükçüsüne bildirilen yerine child_logger log dosyasına çıktı baskı olmalıydı şu örneği dikkate.

Kafam karıştı.

cevap

2

this logging flow chart'da gösterildiği gibi, günlük kaydediciler, günlük kayıtlarını hem ana işleyici nesnelerine hem de kendi işleyicilerine ve geçirir. Ebeveyn günlüğüne bir işleyici eklemeyi deneyin, orada da günlük kaydının işlendiğini göreceksiniz.

0

Bu durumda, 'child_logger' sizin kök kaydedicinizdir. Bunu gibi başlatıldı olsaydı:

adı olsa (foo.bar.baz gibi, potansiyel bir noktayla ayrılan hiyerarşik değerdir: ile tanımlanan

logger = getLogger('root') 
child_logger = getLogger('root.child') 

child_loggerlogger çocuğudur Örneğin, sadece basit bir foo olabilir). Hiyerarşik listede daha aşağı olan logger'lar, listede yukarıdan yukarı kaydedicilerin çocuklarıdır. Örneğin, bir foo ismiyle bir logger verilmişse, foo.bar, foo.bar.baz ve foo.bam isimlerinin yer aldığı logger'lar foo'nun soyundan gelenlerdir. Logger ad hiyerarşisi, Python paket hiyerarşisine benzer ve önerilen yapı logging.getLogger (__name__) kullanılarak kaydedicilerinizi modül başına düzenlerseniz, aynıdır. Çünkü bir modülde, __name__, Python paket ad alanındaki modülün adıdır. Eğer yayılmasının bir çocuk istemiyorsanız

, sen = Falselogger.propagate ayarlayabilirsiniz.

Ayrıca, çocuğunuzun logger dosyası (yani sadece hata ayıklama) yazılır sadece belirli düzeylerde istiyorum ama burada mayın olduğu gibi yine yaymak için üst düzey, bir işleyici bir alt sınıfını oluşturabilir isterseniz:

from logging import DEBUG, INFO, WARN, ERROR, CRITICAL, handlers 

class DebugRotatingFileHandler(handlers.RotatingFileHandler): 
    def __init__(self, filename, mode, maxBytes, backupCount, encoding, delay): 
     super(DebugRotatingFileHandler, self).__init__(
        self, filename, mode, maxBytes, backupCount, encoding, delay) 

    def emit(self, record): 
     if record.levelno != DEBUG: 
      return 
     super(DebugRotatingFileHandler, self).emit(self, record) 

(Evet, yapılabilir bazı gelişmeler olduğunu biliyorum bu eski kodudur.) Örneğin

, root_logger 'ın seviyesi ise, ancak, debug_logger en belirtilen dosyaya şey basacaktır debug_logger.info("Info Message") infaz Bilgiye veya hata ayıklığına ayarlı, dosyanın içine yazdı. Ben hata ayıklama günlüğü için kullanıyorum, hala kaydedici hata mesajı çağrıları yapmak ve bunları kök günlüğüne yazdırmak için yeteneği korurken.

İlgili konular