11import logging
22import threading
3+ import os
34
45try :
56 from logging .handlers import QueueHandler , QueueListener
1112except ImportError :
1213 import queue
1314
14- from stackify import QUEUE_SIZE
15+ from stackify import QUEUE_SIZE , API_URL
1516from stackify .log import LogMsg
1617from stackify .error import ErrorItem
1718from 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+
5774class 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