Skip to content

Commit b356445

Browse files
committed
More work on handler and listener
1 parent c491d68 commit b356445

2 files changed

Lines changed: 74 additions & 11 deletions

File tree

stackify/__init__.py

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,18 @@
3838
from stackify.handler import StackifyHandler
3939

4040

41+
# TODO
42+
# holds our listeners, since more than one handler can service
43+
# the same listener
44+
__listener_cache = {}
45+
46+
4147
def getLogger(name=None, **kwargs):
48+
'''
49+
Get a logger and attach a StackifyHandler if needed:w
50+
'''
4251
if not name:
43-
try:
44-
frame = inspect.stack()[1]
45-
module = inspect.getmodule(frame[0])
46-
name = module.__name__
47-
except IndexError:
48-
name = 'stackify-python-unknown'
52+
name = getCallerName(2)
4953

5054
logger = logging.getLogger(name)
5155

@@ -57,6 +61,35 @@ def getLogger(name=None, **kwargs):
5761
if logger.getEffectiveLevel() == logging.NOTSET:
5862
logger.setLevel(DEFAULT_LEVEL)
5963

64+
handler.listener.start()
65+
6066
return logger
6167

68+
def stopLogging(logger):
69+
'''
70+
Shut down the StackifyHandler on a given logger. This will block
71+
and wait for the queue to finish uploading.
72+
'''
73+
for handler in getHandlers(logger):
74+
handler.listener.stop()
75+
76+
77+
def getCallerName(levels=1):
78+
'''
79+
Gets the name of the module calling this function
80+
'''
81+
try:
82+
frame = inspect.stack()[levels]
83+
module = inspect.getmodule(frame[0])
84+
name = module.__name__
85+
except IndexError:
86+
name = 'stackify-python-unknown'
87+
return name
88+
89+
90+
def getHandlers(logger):
91+
'''
92+
Return the StackifyHandlers on a given logger
93+
'''
94+
return [isinstance(x, StackifyHandler) for x in logger.handlers]
6295

stackify/handler.py

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
import threading
3+
import os
34

45
try:
56
from logging.handlers import QueueHandler, QueueListener
@@ -11,10 +12,11 @@
1112
except ImportError:
1213
import queue
1314

14-
from stackify import QUEUE_SIZE
15+
from stackify import QUEUE_SIZE, API_URL
1516
from stackify.log import LogMsg
1617
from stackify.error import ErrorItem
1718
from stackify.http import HTTPClient
19+
from stackify.application import ApiConfiguration
1820

1921

2022

@@ -24,13 +26,16 @@ class StackifyHandler(QueueHandler):
2426
transmission to Stackify servers.
2527
'''
2628

27-
def __init__(self, queue_=None):
29+
def __init__(self, queue_=None, listener=None **kwargs):
2830
if queue_ is None:
2931
queue_ = queue.Queue(QUEUE_SIZE)
3032

3133
super(StackifyHandler, self).__init__(queue_)
3234

33-
self.listener = StackifyListener(queue_)
35+
if listener is None:
36+
listener = StackifyListener(queue_, **kwargs)
37+
38+
self.listener = listener
3439

3540
def enqueue(self, record):
3641
'''
@@ -47,18 +52,43 @@ def enqueue(self, record):
4752
self.queue.put_nowait(record)
4853

4954
def prepare(self, record):
50-
print(record.__dict__)
5155
msg = LogMsg()
5256
msg.from_record(record)
5357

5458
return msg
5559

5660

61+
def arg_or_env(name, args, default=None):
62+
env_name = 'STACKIFY_{0}'.format(name.upper())
63+
try:
64+
return args.get(name, os.environ[env_name])
65+
except KeyError:
66+
if default:
67+
return default
68+
else:
69+
raise NameError('You must specify the keyword argument {0} or environment variable {1}'.format(
70+
name, env_name))
71+
72+
73+
5774
class StackifyListener(QueueListener):
5875
'''
5976
A listener to read queued log messages and send them to Stackify.
6077
'''
6178

62-
def __init__(self, queue_):
79+
def __init__(self, queue_, config=None, **kwargs):
6380
super(StackifyListener, self).__init__(queue_)
6481

82+
if config is None:
83+
# config not specified, build one with kwargs or environment variables
84+
config = ApiConfiguration(
85+
application = arg_or_env('application', kwargs),
86+
environment = arg_or_env('environment', kwargs),
87+
api_key = arg_or_env('api_key', kwargs),
88+
api_url = arg_or_env('api_url', kwargs, API_URL))
89+
90+
self.http = HTTPClient(config)
91+
92+
def handle(self, record):
93+
94+

0 commit comments

Comments
 (0)