Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何管理登录诅咒_Python_Logging_Curses_Intercept - Fatal编程技术网

Python 如何管理登录诅咒

Python 如何管理登录诅咒,python,logging,curses,intercept,Python,Logging,Curses,Intercept,我使用curses为我的应用程序创建了一个简单的UI,并且我还使用herarch结构(logmain、logmain.child1)在我的模块中包含日志(logging),等等 如果发生日志事件,日志将显示在我的UI中,并分发其外观。 我还创建了一个pad(myLogPad),以便将传入的日志放在那里,但没有成功。 如何截取日志事件并将其打印在屏幕的特定区域(最后一行) def setupLogger(name,file_name): logger = logging.getLogger(nam

我使用curses为我的应用程序创建了一个简单的UI,并且我还使用herarch结构(logmain、logmain.child1)在我的模块中包含日志(logging),等等

如果发生日志事件,日志将显示在我的UI中,并分发其外观。 我还创建了一个pad(myLogPad),以便将传入的日志放在那里,但没有成功。 如何截取日志事件并将其打印在屏幕的特定区域(最后一行)

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)
我尝试在streamhandler=logging.streamhandler()中传递mylog pad,但没有成功。 有什么想法吗?
谢谢

您可以创建自己的
处理程序
类,将日志消息发送到
诅咒
键盘或窗口:

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
复制的) 窗口或键盘需要初始化以允许自动滚动等:

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)

在这里,
屏幕
是主要的
诅咒
屏幕。

多亏@zeeMonkeez,我解决了这个问题。 下面是完整的代码示例:

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

这个代码应该是开箱即用的,上面的代码不适合我

import logging
import curses
import time
from curses import wrapper

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"
            screen.addstr(fs % msg)
            screen.box()
            screen.refresh()
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            raise

def MainWindow(screen):
    _unicode = True
    win = screen.subwin(0,0)
    win.box()
    win.addstr(2,2,"Testing my curses app")
    win1 = win.subwin(0,0)

    win1.getch()
    win1.refresh()
    MAX_ROW, MAX_COL = win1.getmaxyx()
    win1.scrollok(True)
    win1.idlok(True)
    win1.leaveok(True)
    win1.setscrreg(4, MAX_ROW - 3)
    win1.addstr(4, 4, "")


    mh = CursesHandler(win1)
    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('Test Logger')
    logger.addHandler(mh)

    i = 1
    while True:
        logger.error('message ' + str(i))
        time.sleep(.128)
        i+=1;



if __name__=="__main__":
    wrapper(MainWindow)

谢谢Zeemonkez。我完全听从了你的建议,明白了重点!下面我添加了最后一个例子。