美文网首页
排查日志重复打印的问题

排查日志重复打印的问题

作者: eleven_a1dc | 来源:发表于2020-05-15 15:04 被阅读0次

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

    相关文章

      网友评论

          本文标题:排查日志重复打印的问题

          本文链接:https://www.haomeiwen.com/subject/llpcohtx.html