How to write custom python logging handler?

前端 未结 1 705
长情又很酷
长情又很酷 2020-12-02 13:02

How to write custom console log function to output only on the console window log messages on a single line (not append) until the first regular log record.

         


        
相关标签:
1条回答
  • 2020-12-02 13:48
    import logging
    class ProgressConsoleHandler(logging.StreamHandler):
        """
        A handler class which allows the cursor to stay on
        one line for selected messages
        """
        on_same_line = False
        def emit(self, record):
            try:
                msg = self.format(record)
                stream = self.stream
                same_line = hasattr(record, 'same_line')
                if self.on_same_line and not same_line:
                    stream.write(self.terminator)
                stream.write(msg)
                if same_line:
                    stream.write('... ')
                    self.on_same_line = True
                else:
                    stream.write(self.terminator)
                    self.on_same_line = False
                self.flush()
            except (KeyboardInterrupt, SystemExit):
                raise
            except:
                self.handleError(record)
    if __name__ == '__main__':
        import time
        progress = ProgressConsoleHandler()
        console  = logging.StreamHandler()  
    
        logger = logging.getLogger('test')
        logger.setLevel(logging.DEBUG) 
        logger.addHandler(progress)
    
        logger.info('test1')
        for i in range(3):
            logger.info('remaining %d seconds', i, extra={'same_line':True})
            time.sleep(1)   
        logger.info('test2')
    

    Notice that only one handler is being registered, and the extra keyword argument to let the handler know it should stay on one line. There is more logic in the emit() method to handle changes between messages that should stay on one line and messages that need to have their own line.

    0 讨论(0)
提交回复
热议问题