Skip to content

Instantly share code, notes, and snippets.

@chuyskywalker
Created August 27, 2016 21:30
Show Gist options
  • Save chuyskywalker/74d1c74825b41f6255ede888300b8a8b to your computer and use it in GitHub Desktop.
Save chuyskywalker/74d1c74825b41f6255ede888300b8a8b to your computer and use it in GitHub Desktop.
import time
import logging
import pprint
import random
from threading import Thread, Event
class lastPerThread(logging.Handler):
"""
A log handler which keeps the last log message availble per thread
"""
def __init__(self):
"""
Initialize the handler, seutp our dict to hold messages
"""
logging.Handler.__init__(self)
self.lastMessages = {}
self.level = logging.DEBUG
def flush(self):
"""
no-op
"""
def emit(self, record):
"""
Keep the lastMessage list up-to-date
"""
try:
self.lastMessages[record.thread] = record
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
def current(self):
"""
Return all the latest logs per thread
"""
return self.lastMessages
def logloop():
while True:
time.sleep(2)
log.info('sleepy thread! ' + str(random.getrandbits(4)))
def logoutputter(handler):
while True:
time.sleep(5)
logs = handler.current()
for i, msg in logs.iteritems():
print handler.format(msg)
logging.basicConfig(format='%(asctime)s [%(threadName)16s][%(module)14s][%(levelname)8s] %(message)s')
log = logging.getLogger()
log.setLevel(logging.DEBUG)
def main():
handler = lastPerThread()
handler.setFormatter(logging.Formatter(' %(asctime)s [%(threadName)16s][%(module)14s][%(levelname)8s] %(message)s'))
log.addHandler(handler)
t = Thread(target=logoutputter, name='logoutputter', args=(handler,))
t.daemon = True
t.start()
t = Thread(target=logloop, name='logloop')
t.daemon = True
t.start()
time.sleep(2)
t = Thread(target=logloop, name='logloop2')
t.daemon = True
t.start()
while True:
time.sleep(2)
log.info('sleepy main!')
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment