有 main.py
import logging
import lib
class NameFilter(logging.Filter):
def filter(self, record):
name = 'svgmService'
if record.name == name:
return True
else:
return False
# mlog = logging.getLogger('svgmService')
ylog = logging.getLogger('svgmService')
ylog.setLevel(logging.INFO)
log_formater = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(thread)d %(message)s')
log_handler = logging.StreamHandler()
file_handler = logging.FileHandler('svgm.log')
file_handler.setFormatter(log_formater)
file_handler.addFilter(NameFilter())
log_handler.setFormatter(log_formater)
ylog.addHandler(file_handler)
ylog.addHandler(log_handler)
print(ylog.parent.handlers)
# ylog.propagate = False
if __name__ == '__main__':
ylog.info("AAA")
lib.foo()
导入的lib.py
import os
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)-8s %(message)s',)
mlog = logging.getLogger('myLogger')
level = logging.getLevelName('INFO')
mlog.setLevel(level)
def foo():
mlog.info('lib foo')
执行python main.py 会把AAA 打印两次
2020-05-15 15:01:13,484 svgmService INFO 4420892096 AAA
2020-05-15 15:01:13,484 INFO AAA
2020-05-15 15:01:13,485 INFO lib fooo
因为 loggin.basicConfig() 函数 的默认动作是 会给 root.logger 添加一个 streamHandler. 自己用的ylog 的parent log 是 rootlog, ylog 的propagate = True. 该属性 会传递给 父级的 log. 父级log 有streamhandler 所有会再打印一次。解决方法是 第一种设置
ylog.propagate = False
第二种 是 吧 ylog 的 streamhandler 去掉
顺便提下logging.filter
当 我只想记录 某些log 到文件的时候可以用 filter 过滤。不至于 日志文件太多太繁杂。
网友评论