Python logging module is printing lines multiple times

后端 未结 4 729
南旧
南旧 2021-01-01 17:53

I have the following code:

import logging
class A(object):
    def __init__(self):
        self._l = self._get_logger()

    def _get_logger(self):
        l         


        
4条回答
  •  失恋的感觉
    2021-01-01 18:22

    logger is created once, but multiple handlers are created.

    Create A once.

    a = A()
    for msg in ["hey", "there"]:
        a.p(msg)
    

    Or change _get_logger as follow:

    def _get_logger(self):
        loglevel = logging.INFO
        l = logging.getLogger(__name__)
        if not getattr(l, 'handler_set', None):
            l.setLevel(loglevel)
            h = logging.StreamHandler()
            f = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
            h.setFormatter(f)
            l.addHandler(h)
            l.setLevel(loglevel)
            l.handler_set = True
        return l  
    

    UPDATE

    Since Python 3.2, you can use logging.Logger.hasHandlers to see if this logger has any handlers configured. (thanks @toom)

    def _get_logger(self):
        loglevel = logging.INFO
        l = logging.getLogger(__name__)
        if not l.hasHandlers():
            ...
        return l
    

提交回复
热议问题