python - logging模块使用 (一)

  1. 功能

    1. 格式化日志输出

    2. 提供各种日志载体,其中有文本日志、控制台日志、数据库日志,sock等

  2. 本文存在的意义

    1. 如何实现自己的日志载体

    2. 如何将自己的载体添加到logging中

    3. 如何自定义自己的日志级别

  3. 类图

    python - logging模块使用 (一)

  4. 如何将日志输出到QTextBrowser中,以下为简单的实现

  5. # coding=utf-8
    __author__ = 'zouxiaoliang'
    import logging
    from PyQt4 import QtGui
    
    class Log4zTextBrowser(logging.Handler):
        """
        实现一个appender,将调用log4z打印的日志输出到QtGui.QTextBrowser中
        已测试:传入一个QtGui.QTextBrowser的引用时,可以将日志输出到QtGui.QTextBrowser中
        未测试:不传入的情况
        """
        def __init__(self, qt4_text_browser, level=logging.NOTSET):
            logging.Handler.__init__(self, level)
            self.set_name("Log4zTextBrowser")
            self.qt4_text_browser = qt4_text_browser
            if None == self.qt4_text_browser:
                self.log_widget = QtGui.QWidget()
                self.qt4_text_browser = QtGui.QTextBrowser(self.log_widget)
                self.log_witget.show()
            pass
        def emit(self, record):
            """
            实现父类纯虚方法
            :param record: 需要记录的日志信息
            :return: 无
            """
            try:
                msg = self.format(record)
                self.acquire()
                fs = "write error, msg:%s"
                try:
                    ufs = u"%s"
                    self.qt4_text_browser.append(ufs % msg)
                except UnicodeError:
                    print(fs % msg.encode("utf-8"))
            except (KeyboardInterrupt, SystemExit):
                raise
            except:
                self.handleError(record)
            finally:
                self.release()
            pass
        pass

        在上面的源代码中,我们继承了logging.Handle类实现了接口emit,这个在C++中emit理解为一个纯虚函数,子类必须实现。

        这个接口的作用是,当有日志需要输出时,父类会调用这个接口将日志输出到自定义的handle中。

  6. 如何将自定义的appender注册到logging框架中

  7. browser_handle = Log4zTextBrowser(qt4_text_browser_handle)
    # 设置当前handle最低的日志级别
    browser_handle.setLevel(TRACE)
    # 设置日志的输出格式
    if None == log_formatter:
        ui_formatter = logging.Formatter(fmt='[%(asctime)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
    else:
        ui_formatter = log_formatter
    browser_handle.setFormatter(ui_formatter)
    # 将自定义的appender对象注册到logging中
    logging.getLogger('').addHandler(browser_handle)
  8. 如何自定义日志级别

  9. # 扩展日志级别
    log4z_level = {
        TRACE: "TRACE",
        "TRACE": TRACE,
    }
    # 将日志级别添加到logging中
    logging.addLevelName(TRACE, log4z_level[TRACE])

to all:欢迎各位看官点评

你可能感兴趣的:(python,logging)