功能
格式化日志输出
提供各种日志载体,其中有文本日志、控制台日志、数据库日志,sock等
本文存在的意义
如何实现自己的日志载体
如何将自己的载体添加到logging中
如何自定义自己的日志级别
类图
如何将日志输出到QTextBrowser中,以下为简单的实现
# 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中。
如何将自定义的appender注册到logging框架中
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)
如何自定义日志级别
# 扩展日志级别
log4z_level = {
TRACE: "TRACE",
"TRACE": TRACE,
}
# 将日志级别添加到logging中
logging.addLevelName(TRACE, log4z_level[TRACE])