python日志同时写入文件和wxpython文本控件

1 投票
1 回答
807 浏览
提问于 2025-04-17 04:35

我想知道怎么把日志信息同时记录到一个文件里,还能显示在wxpython的文本控件里。

背景是,我有一个基于wxpython的图形界面应用,它会列出一些Python测试文件并执行它们。通过参考这个链接:http://broadcoder.blogspot.com/2009/10/redirecting-python-logging-to.html,我已经成功把Python的日志信息重定向到文本控件里。不过,我还想把这些日志信息也记录到日志文件里。

我这样导入我的测试文件:

     logging.info('Started')
     testid = __import__(str)
     reload(testid)

     testOut = testid.main()

在每个测试文件里,我简单地使用了import logging,这样我的日志信息就能显示在文本控件里。但是,我还希望这些测试日志信息也能根据文件名重定向到一个日志文件里。我该怎么同时把日志信息发送到这两个地方呢?如果我在测试文件里使用logging.basicConfig,消息还是只会发送到文本控件。我在TestGUI.py文件里导入了大约5个Python测试文件,而在我的测试文件中,我只是使用了import logging,同时我在TestGUI.py文件里设置了日志记录器。

    self.logr = logging.getLogger('')
    self.logr.setLevel(logging.INFO)
    hdlr = WxLog(self.log)
    hdlr.setFormatter(logging.Formatter('%(message)s '))
    self.logr.addHandler(hdlr)

在我的测试文件里,我做了类似这样的事情:

      logger = logging.getLogger('')   
      fh = logging.FileHandler("log.html",mode='w')
      formatter = logging.Formatter('%(message)s')
      fh.setFormatter(formatter)
      logger.addHandler(fh)
      a= 5
      b= 6

      logging.info('a=5')
      logging.info('b=6')
      c= a+b
      logging.info('adding b and  c')
      fh.close()

当我多次运行这个测试时,我遇到了ValueError: I/O operation on closed file的错误。

1 个回答

5

一个日志记录器可以有多个处理器!这样你就可以很容易地实现这个功能。

举个例子:

import logging
logger = logging.getLogger('myapp')
hdlr = logging.FileHandler('var/myapp.log')
hdlr2 = logging.FileHandler('var/myapp2.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
hdlr2.setFormatter(formatter)
logger.addHandler(hdlr)
logger.addHandler(hdlr2)
logger.setLevel(logging.INFO)
logger.info('a log message')

撰写回答