有 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')
執(zhí)行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() 函數(shù) 的默認動作是 會給 root.logger 添加一個 streamHandler. 自己用的ylog 的parent log 是 rootlog, ylog 的propagate = True. 該屬性 會傳遞給 父級的 log. 父級log 有streamhandler 所有會再打印一次。解決方法是 第一種設置
ylog.propagate = False
第二種 是 吧 ylog 的 streamhandler 去掉
順便提下logging.filter
當 我只想記錄 某些log 到文件的時候可以用 filter 過濾。不至于 日志文件太多太繁雜吹泡。