2015-01-05 18 views
9

Tôi đã tạo một giao diện người dùng đơn giản cho ứng dụng của mình bằng cách sử dụng các lời nguyền và tôi cũng bao gồm nhật ký (ghi nhật ký) trong các mô-đun của mình bằng cấu trúc cơ thể (logmain, logmain.child1) v.v.Làm cách nào để quản lý đăng nhập bằng lời nguyền

Trong trường hợp sự kiện nhật ký xảy ra, nhật ký được hiển thị trong giao diện người dùng của tôi, làm gián đoạn sự hiện diện của nó. Tôi cũng tạo ra một pad (myLogPad) để toput có các bản ghi đến, nhưng không thành công. Làm thế nào tôi có thể chặn sự kiện nhật ký và in nó trong một khu vực cụ thể (dòng cuối cùng) của màn hình của tôi?

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) 

Tôi cố gắng vượt qua mylog pad trong streamhandler = logging.StreamHandler() nhưng không thành công. Bất kỳ ý tưởng nào? Cảm ơn bạn

Trả lời

5

Bạn có thể tạo Handler lớp của riêng bạn để phát ra thông điệp đăng nhập vào một pad curses hoặc cửa sổ:

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) 

(Điều này đã được cơ bản sao chép từ logging.StreamHandler.) Cửa sổ hoặc pad cần phải được khởi tạo để cho phép di chuyển tự động v.v .:

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) 

Ở đây, screen là chính curses màn hình.

+0

cảm ơn zeeMonkeez. Tôi theo wxactly đề xuất của bạn và có điểm! Dưới đây tôi đã thêm ví dụ cuối cùng. –

4

Nhờ @zeeMonkeez tôi đã giải quyết được sự cố. Bên dưới ví dụ về mã hoàn chỉnh:

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 
Các vấn đề liên quan