如何管理诅咒记录 [英] How to manage logging in curses
问题描述
我使用curses为我的应用程序创建了一个简单的UI,并且我还使用了层次结构(logmain,logmain.child1)等在模块中添加了日志(logging).
I created a simple UI for my application using curses and I also include logs (logging) in my modules using herarchy structure (logmain, logmain.child1) and so on.
万一发生日志事件,该日志将显示在我的UI中,从而破坏其外观. 我还创建了一个便笺本(myLogPad),以便将传入的日志放入那里,但是没有成功. 如何截取日志事件并将其打印在屏幕的特定区域(最后一行)?
In case an log event occurs the log is displayed in my UI,distroying its apparence. I also created a pad (myLogPad) in order toput there the incoming logs, but without success. How I can intercept the log event and print it in a specific area (last line) of my screen?
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)
我尝试将mylog pad传递到streamhandler = logging.StreamHandler()中,但没有成功. 任何的想法? 谢谢
I try to pass mylog pad in the streamhandler = logging.StreamHandler() but without sucess. Any idea? Thank you
推荐答案
您可以创建自己的Handler
类,以将日志消息发送到curses
面板或窗口:
You can create your own Handler
class to emit log messages to a curses
pad or window:
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)
(这基本上是从logging.StreamHandler
复制的.)
窗口或垫子需要初始化以允许自动滚动等:
(This was basically copied from logging.StreamHandler
.)
The window or pad needs to be initialized to allow automatic scrolling 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)
screen
是curses
主屏幕.
这篇关于如何管理诅咒记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!