python logging 重複寫日誌問題

來源:互聯網
上載者:User

標籤:日誌記錄   print   擷取   pre   etl   是你   ogg   time   深度   

用Python的logging模組記錄日誌時,遇到了重複記錄日誌的問題,第一條記錄寫一次,第二條記錄寫兩次,第三條記錄寫三次。。。很頭疼,這樣記日誌可不行。網上搜尋到了原因與解決方案:

原因:沒有移除handler
解決:在日誌記錄完之後removeHandler

修改前範例程式碼:

import loggingdef log(message):    logger = logging.getLogger(‘testlog‘)    streamhandler = logging.StreamHandler()    streamhandler.setLevel(logging.ERROR)    formatter = logging.Formatter(‘%(asctime)s - %(levelname)s - %(name)s - %(message)s‘)    streamhandler.setFormatter(formatter)    logger.addHandler(streamhandler)    logger.error(message)if __name__ == ‘__main__‘:    log(‘hi‘)    log(‘hi too‘)    log(‘hi three‘)

 

修改前輸出結果:

2016-07-08 09:17:29,740 - ERROR - testlog - hi
2016-07-08 09:17:29,740 - ERROR - testlog - hi too
2016-07-08 09:17:29,740 - ERROR - testlog - hi too
2016-07-08 09:17:29,740 - ERROR - testlog - hi three
2016-07-08 09:17:29,740 - ERROR - testlog - hi three
2016-07-08 09:17:29,740 - ERROR - testlog - hi three

修改後範例程式碼:

import loggingdef log(message):    logger = logging.getLogger(‘testlog‘)    streamhandler = logging.StreamHandler()    streamhandler.setLevel(logging.ERROR)    formatter = logging.Formatter(‘%(asctime)s - %(levelname)s - %(name)s - %(message)s‘)    streamhandler.setFormatter(formatter)    logger.addHandler(streamhandler)    logger.error(message)    #  添加下面一句,在記錄日誌之後移除控制代碼    logger.removeHandler(streamhandler)if __name__ == ‘__main__‘:    log(‘hi‘)    log(‘hi too‘)    log(‘hi three‘)

 

修改後輸出結果:

2016-07-08 09:32:28,206 - ERROR - testlog - hi
2016-07-08 09:32:28,206 - ERROR - testlog - hi too
2016-07-08 09:32:28,206 - ERROR - testlog - hi three

深度解析:

Google之後,大概搞明白了,就是你第二次調用log的時候,根據getLogger(name)裡的name擷取同一個logger,而這個logger裡已經有了第一次你添加的handler,第二次調用又添加了一個handler,所以,這個logger裡有了兩個同樣的handler,以此類推,調用幾次就會有幾個handler。。

所以這裡有以下幾個解決辦法:

  1. 每次建立不同name的logger,每次都是新logger,不會有添加多個handler的問題。(ps:這個辦法太笨,不過我之前就是這麼乾的。。)
  2. 像上面一樣每次記錄完日誌之後,調用removeHandler()把這個logger裡的handler移除掉。
  3. 在log方法裡做判斷,如果這個logger已有handler,則不再添加handler。
  4. 與方法2一樣,不過把用pop把logger的handler列表中的handler移除。

下面是方法3與方法4的程式碼範例:

方法3:

import loggingdef log(message):    logger = logging.getLogger(‘testlog‘)    #  這裡進行判斷,如果logger.handlers列表為空白,則添加,否則,直接去寫日誌    if not logger.handlers:        streamhandler = logging.StreamHandler()        streamhandler.setLevel(logging.ERROR)        formatter = logging.Formatter(‘%(asctime)s - %(levelname)s - %(name)s - %(message)s‘)        streamhandler.setFormatter(formatter)        logger.addHandler(streamhandler)    logger.error(message)if __name__ == ‘__main__‘:    log(‘hi‘)    log(‘hi too‘)    log(‘hi three‘)

 

方法4:

import loggingdef log(message):    logger = logging.getLogger(‘testlog‘)    streamhandler = logging.StreamHandler()    streamhandler.setLevel(logging.ERROR)    formatter = logging.Formatter(‘%(asctime)s - %(levelname)s - %(name)s - %(message)s‘)    streamhandler.setFormatter(formatter)    logger.addHandler(streamhandler)    logger.error(message)    #  用pop方法把logger.handlers列表中的handler移除,注意如果你add了多個handler,這裡需多次pop,或者可以直接為handlers列表賦空值    logger.handlers.pop()    # logger.handler = []if __name__ == ‘__main__‘:    log(‘hi‘)    log(‘hi too‘)    log(‘hi three‘)

 

python logging 重複寫日誌問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.