2010-06-25 21 views
39

Özel bir konsol günlüğü işlevi, ilk normal günlük kaydına kadar tek bir satıra (eklenmez) yalnızca konsol penceresi günlük iletilerinde çıkış yapmak için nasıl yazılır.Özel python günlük tutma işleyicisi nasıl yazılır?

progress = ProgressConsoleHandler() 
console = logging.StreamHandler() 

logger = logging.getLogger('test') 
logger.setLevel(logging.DEBUG) 
logger.addHandler(console) 
logger.addHandler(progress) 

logger.info('test1') 
for i in range(3): 
    logger.progress('remaining %d seconds' % i) 
    time.sleep(1) 
logger.info('test2') 

Yani konsol çıkış sadece üç satır şudur:

INFO: test1 
remaining 0 seconds... 
INFO: test2 

bu nasıl uygulanacağı konusunda en iyi yolu herhangi bir öneriniz?

tek işleyicisi kayıtlı ediliyor
+0

'log' nerede tanımlandı? ... 'log' içinde 'log' dışında ... –

+0

Bunların çoğu yardımcı olmalıdır: http://stackoverflow.com/search?q=python+logging+handler –

+0

olası yinelenen [Özel kullanarak yeniden yönlendirme günlük çıkışı günlüğe kaydetme işleci] (http://stackoverflow.com/questions/2819791/redirect-logging-output-using-custom-logging-handler) –

cevap

45
import logging 
class ProgressConsoleHandler(logging.StreamHandler): 
    """ 
    A handler class which allows the cursor to stay on 
    one line for selected messages 
    """ 
    on_same_line = False 
    def emit(self, record): 
     try: 
      msg = self.format(record) 
      stream = self.stream 
      same_line = hasattr(record, 'same_line') 
      if self.on_same_line and not same_line: 
       stream.write(self.terminator) 
      stream.write(msg) 
      if same_line: 
       stream.write('... ') 
       self.on_same_line = True 
      else: 
       stream.write(self.terminator) 
       self.on_same_line = False 
      self.flush() 
     except (KeyboardInterrupt, SystemExit): 
      raise 
     except: 
      self.handleError(record) 
if __name__ == '__main__': 
    import time 
    progress = ProgressConsoleHandler() 
    console = logging.StreamHandler() 

    logger = logging.getLogger('test') 
    logger.setLevel(logging.DEBUG) 
    logger.addHandler(progress) 

    logger.info('test1') 
    for i in range(3): 
     logger.info('remaining %d seconds', i, extra={'same_line':True}) 
     time.sleep(1) 
    logger.info('test2') 

Bildirim ve işleyicisi izin extra kelime argümanı bir satırda kalmalıdır biliyorum. Bir satırda kalması gereken mesajlar ile kendi satırlarının olması gereken mesajlar arasındaki değişiklikleri işlemek için emit() yönteminde daha mantık vardır.

+9

FYI, buna rastlayanlar için: 'sonlandırıcı' özelliği yalnızca Python'da kullanılabilir. 3.2, https://mail.python.org/pipermail/python-list/2010-October/590223.html sayfasına bakın. – Pat

İlgili konular