2015-01-05 12 views
9

Ho creato una semplice interfaccia utente per la mia applicazione usando curses e includo anche i log (logging) nei miei moduli usando la struttura di herarchy (logmain, logmain.child1) e così via.Come gestire l'accesso alle maledizioni

Nel caso in cui si verifichi un evento di registro, il registro viene visualizzato nell'interfaccia utente, che ne distrae l'apparenza. Ho anche creato un pad (myLogPad) per completare i registri in entrata, ma senza successo. Come posso intercettare l'evento del registro e stamparlo in un'area specifica (ultima riga) del mio schermo?

def setupLogger(name,file_name): 
logger = logging.getLogger(name) 
logger.setLevel(logging.DEBUG) 
#formatter = logging.Formatter(
# "%(asctime)s %(threadName)-11s %(levelname)-10s %(message)s") 
formatter = logging.Formatter('%(asctime) -25s - %(name) -15s - %(levelname) -10s - %(message)s') 
formatterDisplay = logging.Formatter('%(asctime)-8s|%(name)-12s|%(levelname)-6s|%(message)-s', '%H:%M:%S') 
# Alternative formatting available on python 3.2+: 
# formatter = logging.Formatter(
#  "{asctime} {threadName:>11} {levelname} {message}", style='{') 

# Log to file 
filehandler = logging.FileHandler(file_name, 'w') 

filehandler.setFormatter(formatter) 
logger.addHandler(filehandler) 

# Log to stdout too 
streamhandler = logging.StreamHandler() 

streamhandler.setFormatter(formatterDisplay) 
logger.addHandler(streamhandler) 

cerco di trasmettere pad mylog nel StreamHandler = logging.StreamHandler(), ma senza sucesso. Qualche idea? Grazie

risposta

5

È possibile creare il proprio Handler classe per emettere messaggi di log a un pad o di una finestra curses:

try: 
    unicode 
    _unicode = True 
except NameError: 
    _unicode = False 

class CursesHandler(logging.Handler): 
    def __init__(self, screen): 
     logging.Handler.__init__(self) 
     self.screen = screen 
    def emit(self, record): 
     try: 
      msg = self.format(record) 
      screen = self.screen 
      fs = "\n%s" 
      if not _unicode: #if no unicode support... 
       screen.addstr(fs % msg) 
       screen.refresh() 
      else: 
       try: 
        if (isinstance(msg, unicode)): 
         ufs = u'\n%s' 
         try: 
          screen.addstr(ufs % msg) 
          screen.refresh() 
         except UnicodeEncodeError: 
          screen.addstr((ufs % msg).encode(code)) 
          screen.refresh() 
        else: 
         screen.addstr(fs % msg) 
         screen.refresh() 
       except UnicodeError: 
        screen.addstr(fs % msg.encode("UTF-8")) 
        screen.refresh() 
     except (KeyboardInterrupt, SystemExit): 
      raise 
     except: 
      self.handleError(record) 

(Questo è stato praticamente copiato da logging.StreamHandler.) La finestra o tampone deve essere inizializzato per consentire lo scorrimento automatico, ecc .:

screen.nodelay(1) 
maxy, maxx = screen.getmaxyx() 
begin_x = 2; begin_y = maxy-5 
height = 5; width = maxx-4 
win = curses.newwin(height, width, begin_y, begin_x) 
curses.setsyx(-1, -1) 
screen.addstr("Testing my curses app") 
screen.refresh() 
win.refresh() 
win.scrollok(True) 
win.idlok(True) 
win.leaveok(True) 
mh = CursesHandler(win) 
mh.setFormatter(formatterDisplay) 
logger.addHandler(mh) 

Qui, screen è la schermata principale curses.

+0

grazie zeeMonkeez. Ho seguito wxactly il tuo suggerimento e ottenuto il punto! Di seguito ho aggiunto l'esempio finale. –

4

Grazie a @zeeMonkeez ho risolto il problema. Sotto l'esempio di codice completo:

import logging 
import curses 
import time 

class CursesHandler(logging.Handler): 
    def __init__(self, screen): 
     logging.Handler.__init__(self) 
     self.screen = screen 
    def emit(self, record): 
     try: 
      msg = self.format(record) 
      screen = self.screen 
      fs = "\n%s" 
      if not _unicode: #if no unicode support... 
       screen.addstr(fs % msg) 
       screen.refresh() 
      else: 
       try: 
        if (isinstance(msg, unicode)): 
         ufs = u'\n%s' 
         try: 
          screen.addstr(ufs % msg) 
          screen.refresh() 
         except UnicodeEncodeError: 
          screen.addstr((ufs % msg).encode(code)) 
          screen.refresh() 
        else: 
         screen.addstr(fs % msg) 
         screen.refresh() 
       except UnicodeError: 
        screen.addstr(fs % msg.encode("UTF-8")) 
        screen.refresh() 
     except (KeyboardInterrupt, SystemExit): 
      raise 
     except: 
      self.handleError(record) 


try: 
    _unicode = True 
    screen = curses.initscr() 
    screen.nodelay(1) 
    maxy, maxx = screen.getmaxyx() 
    begin_x = 2; begin_y = maxy-5 
    height = 5; width = maxx-4 
    win = curses.newwin(height, width, begin_y, begin_x) 
    curses.setsyx(-1, -1) 
    screen.addstr("Testing my curses app") 
    screen.refresh() 
    win.refresh() 
    win.scrollok(True) 
    win.idlok(True) 
    win.leaveok(True) 
    mh = CursesHandler(win) 
    formatter = logging.Formatter('%(asctime) -25s - %(name) -15s - %(levelname) -10s - %(message)s') 
    formatterDisplay = logging.Formatter('%(asctime)-8s|%(name)-12s|%(levelname)-6s|%(message)-s', '%H:%M:%S') 
    mh.setFormatter(formatterDisplay) 
    logger = logging.getLogger('myLog') 
    logger.addHandler(mh) 


    for i in range(10): 
     logger.error('message ' + str(i)) 
     time.sleep(1) 


    curses.curs_set(1) 
    curses.nocbreak() 
    curses.echo() 
    curses.endwin() 

except NameError: 
    _unicode = False