Двойные и четырехкратные сообщения журнала - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь записать файл журнала и, для текущей отладки, тоже записать журнал в консоль. К моему удивлению, у меня странный вывод как в консоли, так и в файле

Вот код:

#in a method in a subclass of ScreenListener
def updateVisible(self):
    if all([section['isOK'] for section in self.status_dict.values()]):
        self.config(state = "normal", text = 'Start', relief = RAISED, command=self.monitorROI)                
    else:
        self.config(state = "disabled", text = 'Stop', relief = SUNKEN)

def stopMonitoring(self):
    logger.info('Monitoring stopped')
    self.config(state="normal", text='Start', relief=RAISED, command=self.monitorROI)
    if self.halarm is not None:
        self.after_cancel(self.halarm)
        self.halarm = None 

def monitorROI(self):
    logger.info('Monitoring started')
    self.config(state="normal", text='Started', relief=SUNKEN, command=self.stopMonitoring)
    self.halarm = self.after(100, self.getColorDiff)

def main():    
    tk_root = Tk()
    listener_gui = ScreenListener(tk_root)
    tk_root.mainloop()

if __name__ == '__main__':
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)
    curr_dir = os.path.dirname(os.path.realpath(__file__))
    log_fpath = "{}/screen_listener.log".format(curr_dir)
    lfh = logging.FileHandler(log_fpath)
    lfh.setLevel(logging.INFO)
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)
    formatter = logging.Formatter(fmt='%(asctime)s.%(msecs)03d : %(message)s',datefmt='%d.%m.%Y,%H:%M:%S')
    lfh.setFormatter(formatter)
    ch.setFormatter(formatter)
    logger.addHandler(ch)
    logger.addHandler(lfh)    
    main()

Вот вывод

Консоль (дубликаты)

05.06.2019,03:47:09.185 : 
05.06.2019,03:47:09.185 : Monitoring started
05.06.2019,03:47:24.670 : 
05.06.2019,03:47:24.670 : Sending command

Файл журнала (квадр)

05.06.2019,03:47:09.185 : 
05.06.2019,03:47:09.185 : 
05.06.2019,03:47:09.185 : 
05.06.2019,03:47:09.185 : Monitoring started
05.06.2019,03:47:24.670 : 
05.06.2019,03:47:24.670 : 
05.06.2019,03:47:24.670 : 
05.06.2019,03:47:24.670 : Sending command

Не могли бы вы подсказать, в чем причина?

1 Ответ

0 голосов
/ 05 июня 2019

Проверка количества уже добавленных обработчиков сделала свое дело

if not len(logger.handlers):
     logger.addHandler(ch)
     logger.addHandler(lfh)

В качестве альтернативы также может помочь использование logging.config.dictConfig (подробности см. этот ответ).

Однако я не понимаю, как код, в который добавляются обработчики, выполняется более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...