msg, args, exc_info, func=None, sinfo=None, **kwargs):
ct = time.time()
self.name = name # logger称号
self.msg = msg # 日志标识信息
...
self.args = args # 变量
self.levelname = getLevelName(level)
...
def getMessage(self):
msg = str(self.msg)
if self.args:
msg = msg % self.args # 格式化音讯
return msg
处置器对象 Hander顶级Handler定义了Handler的模版办法
class Handler(Filterer): # 处置器也可以过滤日志
def __init__(self, level=NOTSET):
Filterer.__init__(self)
self._name = None
self.level = _checkLevel(level) # handler也有日志级别
self.formatter = None
_addHandlerRef(self)
self.createLock()
def handle(self, record): # 处置日志
rv = self.filter(record) # 过滤日志
if rv:
self.acquire() # 央求锁
try:
self.emit(record) # 提交记载,由不同子类完成
finally:
self.release() # 释放锁
return rv
默许的console流 StreamHandler
class StreamHandler(Handler):
terminator = '\n' # 自动换行
def __init__(self, stream=None):
Handler.__init__(self)
if stream is None:
stream = sys.stderr # 默许运用stderr输入
self.stream = stream
def emit(self, record):
try:
msg = self.format(record) # 格式化日志记载
stream = self.stream
stream.write(msg + self.terminator) # 写日志
self.flush() # 刷新写缓存
except Exception:
...
def format(self, record):
if self.formatter:
fmt = self.formatter
else:
fmt = _defaultFormatter
return fmt.format(record) # 运用格式化器格式化日志记载
为什么运用stderr,可以看下面的测试中的输入都是到console:
print("haha")
print("fatal error", file=sys.stderr)
sys.stderr.write("fatal error\n")
格式器对象 Formatter格式化器主要运用Formatter和Style完成
class Formatter(object):
def __init__(self, fmt=None, datefmt=None, style='%', validate=True):
self._style = _STYLES[style][0](fmt)
self._fmt = self._style._fmt
self.datefmt = datefmt
def format(self, record):
record.message = record.getMessage()
s = self.formatMessage(record)
return s
def formatMessage(self, record):
return self._style.format(record) # 格式化
Style类
class PercentStyle(object):
default_format = '%(message)s'
asctime_format = '%(asctime)s'
asctime_search = '%(asctime)'
validation_pattern = re.compile(r'%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]', re.I)
def __init__(self, fmt):
self._fmt = fmt or self.default_format
def usesTime(self):
return self._fmt.find(self.asctime_search) >= 0
def validate(self):
(责任编辑:admin)