Skip to content

Instantly share code, notes, and snippets.

@dwf
Last active August 29, 2015 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dwf/83f79c0533a26f56d09a to your computer and use it in GitHub Desktop.
Save dwf/83f79c0533a26f56d09a to your computer and use it in GitHub Desktop.
Proof of concept using a logging handler and LogRecord "extras" attribute to manage a progress bar.
# Copyright (c) 2015 David Warde-Farley.
#
# Permission is granted to use this code under the MIT license:
# http://opensource.org/licenses/mit-license.php
import logging
import progressbar
import time
class ProgressBarHandler(logging.Handler):
def __init__(self, max_val_attr, curr_val_attr, widgets=None,
start_predicate=None, update_predicate=None,
level=logging.DEBUG):
super(ProgressBarHandler, self).__init__(level)
self.max_val_attr = max_val_attr
self.curr_val_attr = curr_val_attr
self.widgets = widgets
self.start_predicate = (start_predicate if start_predicate is not None
else lambda x: hasattr(x, self.max_val_attr))
self.update_predicate = (update_predicate
if update_predicate is not None
else lambda x: hasattr(x, self.curr_val_attr))
self.level = level
def handle(self, record):
if self.start_predicate(record):
maxval = getattr(record, self.max_val_attr)
self.progress_bar = progressbar.ProgressBar(
maxval=maxval,
widgets=self.widgets).start()
elif self.update_predicate(record):
currval = getattr(record, self.curr_val_attr)
self.progress_bar.update(currval)
if __name__ == "__main__":
log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
log.addHandler(ProgressBarHandler(max_val_attr='num_things',
curr_val_attr='done_so_far'))
log.debug('A setup message', extra={'num_things': 10000})
for i in range(10000):
log.info('Irrelevant stuff')
log.debug('More irrelevant stuff')
log.debug("Look ma, no progressbar calls!", extra={'done_so_far': i})
time.sleep(0.2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment