排查日志重复打印的问题

2020-05-15  本文已影响0人  eleven_a1dc

有 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 过滤。不至于 日志文件太多太繁杂。

上一篇下一篇

猜你喜欢

热点阅读