Per thread logging in python

前端 未结 5 1714
逝去的感伤
逝去的感伤 2021-01-13 05:03

Consider a multi threaded python application using python logger module. I want to do per thread logging, so I have appended the a unique-ID (not thread id) at the bottom of

5条回答
  •  佛祖请我去吃肉
    2021-01-13 05:36

    It can be implemented by logging.Filter, here's an example:

    import threading
    import logging
    import logging.config
    
    
    class ThreadLogFilter(logging.Filter):
        """
        This filter only show log entries for specified thread name
        """
    
        def __init__(self, thread_name, *args, **kwargs):
            logging.Filter.__init__(self, *args, **kwargs)
            self.thread_name = thread_name
    
        def filter(self, record):
            return record.threadName == self.thread_name
    
    
    def start_thread_logging():
        """
        Add a log handler to separate file for current thread
        """
        thread_name = threading.Thread.getName(threading.current_thread())
        log_file = '/tmp/perThreadLogging-{}.log'.format(thread_name)
        log_handler = logging.FileHandler(log_file)
    
        log_handler.setLevel(logging.DEBUG)
    
        formatter = logging.Formatter(
            "%(asctime)-15s"
            "| %(threadName)-11s"
            "| %(levelname)-5s"
            "| %(message)s")
        log_handler.setFormatter(formatter)
    
        log_filter = ThreadLogFilter(thread_name)
        log_handler.addFilter(log_filter)
    
        logger = logging.getLogger()
        logger.addHandler(log_handler)
    
        return log_handler
    
    
    def stop_thread_logging(log_handler):
        # Remove thread log handler from root logger
        logging.getLogger().removeHandler(log_handler)
    
        # Close the thread log handler so that the lock on log file can be released
        log_handler.close()
    
    
    def worker():
        thread_log_handler = start_thread_logging()
        logging.info('Info log entry in sub thread.')
        logging.debug('Debug log entry in sub thread.')
        stop_thread_logging(thread_log_handler)
    
    
    def config_root_logger():
        log_file = '/tmp/perThreadLogging.log'
    
        formatter = "%(asctime)-15s" \
                    "| %(threadName)-11s" \
                    "| %(levelname)-5s" \
                    "| %(message)s"
    
        logging.config.dictConfig({
            'version': 1,
            'formatters': {
                'root_formatter': {
                    'format': formatter
                }
            },
            'handlers': {
                'console': {
                    'level': 'INFO',
                    'class': 'logging.StreamHandler',
                    'formatter': 'root_formatter'
                },
                'log_file': {
                    'class': 'logging.FileHandler',
                    'level': 'DEBUG',
                    'filename': log_file,
                    'formatter': 'root_formatter',
                }
            },
            'loggers': {
                '': {
                    'handlers': [
                        'console',
                        'log_file',
                    ],
                    'level': 'DEBUG',
                    'propagate': True
                }
            }
        })
    
    
    if __name__ == '__main__':
        config_root_logger()
    
        logging.info('Info log entry in main thread.')
        logging.debug('Debug log entry in main thread.')
    
        for i in xrange(3):
            t = threading.Thread(target=worker,
                                 name='Thread-{}'.format(i),
                                 args=[])
            t.start()
    
    

    Console output:

    $ python perThreadLoggingSample.py
    2019-03-07 10:29:34,318| MainThread | INFO | Info log entry in main thread.
    2019-03-07 10:29:34,320| Thread-0   | INFO | Info log entry in sub thread.
    2019-03-07 10:29:34,320| Thread-1   | INFO | Info log entry in sub thread.
    2019-03-07 10:29:34,320| Thread-2   | INFO | Info log entry in sub thread.
    $
    

    Check log files:

    $ cat /tmp/perThreadLogging.log
    2019-03-07 10:29:34,318| MainThread | INFO | Info log entry in main thread.
    2019-03-07 10:29:34,319| MainThread | DEBUG| Debug log entry in main thread.
    2019-03-07 10:29:34,320| Thread-0   | INFO | Info log entry in sub thread.
    2019-03-07 10:29:34,320| Thread-1   | INFO | Info log entry in sub thread.
    2019-03-07 10:29:34,321| Thread-0   | DEBUG| Debug log entry in sub thread.
    2019-03-07 10:29:34,320| Thread-2   | INFO | Info log entry in sub thread.
    2019-03-07 10:29:34,321| Thread-1   | DEBUG| Debug log entry in sub thread.
    2019-03-07 10:29:34,321| Thread-2   | DEBUG| Debug log entry in sub thread.
    $
    $ cat /tmp/perThreadLogging-Thread-0.log
    2019-03-07 10:29:34,320| Thread-0   | INFO | Info log entry in sub thread.
    2019-03-07 10:29:34,321| Thread-0   | DEBUG| Debug log entry in sub thread.
    $
    $ cat /tmp/perThreadLogging-Thread-1.log
    2019-03-07 10:29:34,320| Thread-1   | INFO | Info log entry in sub thread.
    2019-03-07 10:29:34,321| Thread-1   | DEBUG| Debug log entry in sub thread.
    $
    $ cat /tmp/perThreadLogging-Thread-2.log
    2019-03-07 10:29:34,320| Thread-2   | INFO | Info log entry in sub thread.
    2019-03-07 10:29:34,321| Thread-2   | DEBUG| Debug log entry in sub thread.
    $
    

提交回复
热议问题