2015-01-05 15 views
9

Ich erstellte eine einfache Benutzeroberfläche für meine Anwendung mit Curses und ich schließe auch Protokolle (Protokollierung) in meine Module mit Herarchie Struktur (logmain, logmain.child1) und so weiter.So verwalten Sie die Anmeldung in Flüche

Wenn ein Protokollereignis auftritt, wird das Protokoll in meiner Benutzerschnittstelle angezeigt, wodurch seine Erscheinungsform zerstört wird. Ich habe auch ein Pad (myLogPad) erstellt, um dort die eingehenden Protokolle zu topt, aber ohne Erfolg. Wie kann ich das Log-Ereignis abfangen und es in einem bestimmten Bereich (letzte Zeile) meines Bildschirms drucken?

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) 

Ich versuche mylog Pad im streamhandler = logging.StreamHandler() übergeben, aber ohne Erfolg. Irgendeine Idee? Danke

Antwort

5

Sie können Ihre eigene Handler Klasse zu emittieren Log-Meldungen zu einem curses Pad oder Fenster erstellen:

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) 

(Dies wurde grundsätzlich kopiert von logging.StreamHandler.) Das Fenster oder Pad muss initialisiert werden Hier automatische Scrollen etc .:

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) 

ist screen der Haupt curses Bildschirm zu ermöglichen.

+0

danke zeeMonkeez. Ich habe deinen Vorschlag genau verfolgt und verstanden! Unten habe ich das Finale-Beispiel hinzugefügt. –

4

Dank @zeeMonkeez habe ich das Problem gelöst. Unter dem vollständigen Codebeispiel:

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