Skip to content

Commit

Permalink
first cut at tree-building API and synchronous implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
mahmoud committed Mar 13, 2016
1 parent aa5d9e2 commit 8f85044
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 2 deletions.
48 changes: 48 additions & 0 deletions lithoxyl/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,37 @@ def note(self, name, message, *a, **kw):
nh(name, message)
return

def _sync_parent_getter(self, record):
import weakref

logger = record.logger

try:
rec_tree = self._record_tree[logger]
except AttributeError:
self._record_tree = {}
rec_tree = self._record_tree[logger] = weakref.WeakKeyDictionary()
self._last_logged = weakref.WeakKeyDictionary({logger: None})
except KeyError:
rec_tree = self._record_tree[logger] = weakref.WeakKeyDictionary()

try:
ret = rec_tree[record]
except KeyError:
# haven't seen this one before
if self._last_logged.get(logger):
ret = self._last_logged[logger]
# TODO: might be belt and braces
if ret.record_id < record.record_id:
self._last_logged[logger] = record
else:
# nothing logged yet
ret = None
self._last_logged[logger] = record

rec_tree[record] = ret
return ret

def enable_async(self, **kwargs):
update_loggers = kwargs.pop('update_loggers', True)
update_sigterm = kwargs.pop('update_sigterm', True)
Expand Down Expand Up @@ -134,6 +165,23 @@ def remove_logger(self, logger):
pass


class SyncTreeTracker(object):
def __init__(self):
self.tree = {}

def get_parent(self, logger, record):
try:
stack = self.tree[logger]
except KeyError:
self.tree[logger] = []
try:
ret = stack[-1]
except IndexError:
ret = None
stack.append(self)
return ret


def signal_sysexit(signum, frame):
# return code ends up being 143 for sigterm, See page 544 Kerrisk
# for more see atexit_reissue_sigterm docstring for more details
Expand Down
2 changes: 2 additions & 0 deletions lithoxyl/record.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ def __init__(self, logger, level, name,
# these can go internal and be lazily created through properties
self.warn_events = []
self.exc_events = []

self.parent_record = self.logger.context._sync_parent_getter(self)
return

def __repr__(self):
Expand Down
5 changes: 3 additions & 2 deletions playground.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@

log = Logger('test', sinks=[stderr_sink])

with log.critical('first'):
print 'did some work'
with log.critical('first') as lr1:
with log.critical('second') as lr2:
print 'did some work'

import os
print os.getpid()
Expand Down

0 comments on commit 8f85044

Please sign in to comment.