排查日志重復打印的問題

有 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 所有會再打印一次。解決方法是 第一種設(shè)置
ylog.propagate = False
第二種 是 吧 ylog 的 streamhandler 去掉

順便提下logging.filter
當 我只想記錄 某些log 到文件的時候可以用 filter 過濾。不至于 日志文件太多太繁雜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容