77import time , os , signal
88import datetime
99import logging
10-
10+ import logging . handlers
1111from pyres import ResQ , Stat
1212from pyres .exceptions import NoQueueError
1313from pyres .utils import OrderedDict
1414from pyres .job import Job
1515import pyres .json_parser as json
1616
17+ def setup_logging (namespace = '' , log_level = logging .INFO , log_file = None ):
18+
19+ logger = multiprocessing .get_logger ()
20+ #logger = multiprocessing.log_to_stderr()
21+ logger .setLevel (log_level )
22+ format = '%(asctime)s %(levelname)s ' + namespace + ': %(message)s'
23+ if log_file :
24+ handler = logging .handlers .RotatingFileHandler (log_file , maxBytes = 104857600 , backupCount = 5 )
25+ else :
26+ handler = logging .StreamHandler ()
27+ handler .setFormatter (logging .Formatter ((format )))
28+ logger .addHandler (handler )
29+ return logger
30+
1731class Minion (multiprocessing .Process ):
18- def __init__ (self , queues , server , password ):
19- #super(Minion,self).__init__(name='Minion')
32+ def __init__ (self , queues , server , password , log_level = logging .INFO , log_file = None ):
2033 multiprocessing .Process .__init__ (self , name = 'Minion' )
2134
22- format = '%(asctime)s %(levelname)s %(filename)s-%(lineno)d: %(message)s'
23- logHandler = logging .StreamHandler ()
24- logHandler .setFormatter (logging .Formatter (format ))
25- self .logger = multiprocessing .get_logger ()
26- self .logger .addHandler (logHandler )
27- self .logger .setLevel (logging .DEBUG )
35+ # format = '%(asctime)s %(levelname)s %(filename)s-%(lineno)d: %(message)s'
36+ # logHandler = logging.StreamHandler()
37+ # logHandler.setFormatter(logging.Formatter(format))
38+ # self.logger = multiprocessing.get_logger()
39+ # self.logger.addHandler(logHandler)
40+ # self.logger.setLevel(logging.DEBUG)
2841
2942 self .queues = queues
3043 self ._shutdown = False
3144 self .hostname = os .uname ()[1 ]
3245 self .server = server
3346 self .password = password
3447
48+ self .log_level = log_level
49+ self .log_file = log_file
50+
3551 def prune_dead_workers (self ):
3652 pass
3753
@@ -68,15 +84,15 @@ def process(self, job):
6884 return
6985 try :
7086 self .working_on (job )
71- return job .perform ()
87+ job .perform ()
7288 except Exception , e :
7389 exceptionType , exceptionValue , exceptionTraceback = sys .exc_info ()
7490 self .logger .error ("%s failed: %s" % (job , e ))
7591 job .fail (exceptionTraceback )
7692 self .failed ()
7793 else :
78- self .logger .info ( 'completed job' )
79- self .logger .debug ( 'job details : %s' % job )
94+ self .logger .debug ( "Hells yeah" )
95+ self .logger .info ( 'completed job : %s' % job )
8096 finally :
8197 self .done_working ()
8298
@@ -100,7 +116,7 @@ def processed(self):
100116 total_processed .incr ()
101117
102118 def done_working (self ):
103- self .logger .info ('done working' )
119+ self .logger .debug ('done working' )
104120 self .processed ()
105121 self .resq .redis .delete ("resque:minion:%s" % str (self ))
106122
@@ -130,6 +146,8 @@ def run(self):
130146 self .resq = self .server
131147 else :
132148 raise Exception ("Bad server argument" )
149+ namespace = 'minion:%s' % self .pid
150+ self .logger = setup_logging (namespace , self .log_level , self .log_file )
133151 self .work ()
134152 #while True:
135153 # job = self.q.get()
@@ -142,7 +160,7 @@ class Khan(object):
142160 'REMOVE' : '_remove_minion' ,
143161 'SHUTDOWN' : '_schedule_shutdown'
144162 }
145- def __init__ (self , pool_size = 5 , queues = [], server = 'localhost:6379' , password = None ):
163+ def __init__ (self , pool_size = 5 , queues = [], server = 'localhost:6379' , password = None , logging_level = logging . INFO , log_file = None ):
146164 #super(Khan,self).__init__(queues=queues,server=server,password=password)
147165 self ._shutdown = False
148166 self .pool_size = int (pool_size )
@@ -154,6 +172,9 @@ def __init__(self, pool_size=5, queues=[], server='localhost:6379', password=Non
154172 self ._workers = OrderedDict ()
155173 self .server = server
156174 self .password = password
175+ self .logging_level = logging_level
176+ self .log_file = log_file
177+ self .logger = setup_logging ('khan' , self .logging_level , self .log_file )
157178 #self._workers = list()
158179
159180 def setup_resq (self ):
@@ -171,6 +192,7 @@ def validate_queues(self):
171192
172193 def startup (self ):
173194 self .register_signal_handlers ()
195+
174196
175197 def register_signal_handlers (self ):
176198 signal .signal (signal .SIGTERM , self .schedule_shutdown )
@@ -183,7 +205,7 @@ def _schedule_shutdown(self):
183205 self .schedule_shutdown (None , None )
184206
185207 def schedule_shutdown (self , signum , frame ):
186- logging .info ('Khan Shutdown scheduled' )
208+ self . logger .info ('Khan Shutdown scheduled' )
187209 self ._shutdown = True
188210
189211 def kill_child (self , signum , frame ):
@@ -200,16 +222,16 @@ def register_khan(self):
200222
201223 def _check_commands (self ):
202224 if not self ._shutdown :
203- logging .debug ('Checking commands' )
225+ self . logger .debug ('Checking commands' )
204226 command = self .resq .redis .lpop ('resque:khan:%s' % str (self ))
205- logging .debug ('COMMAND FOUND: %s ' % command )
227+ self . logger .debug ('COMMAND FOUND: %s ' % command )
206228 if command :
207229 import pdb ;pdb .set_trace ()
208230 self .process_command (command )
209231 self ._check_commands ()
210232
211233 def process_command (self , command ):
212- logging .info ('Processing Command' )
234+ self . logger .info ('Processing Command' )
213235 #available commands, shutdown, add 1, remove 1
214236 command_item = self ._command_map .get (command , None )
215237 if command_item :
@@ -224,11 +246,11 @@ def add_minion(self):
224246 self .resq .redis .sadd ('resque:khans' ,str (self ))
225247
226248 def _add_minion (self ):
227- logging .info ('Adding minion' )
228- m = Minion (self .queues , self .server , self .password )
249+ self . logger .info ('Adding minion' )
250+ m = Minion (self .queues , self .server , self .password , log_level = self . logging_level )
229251 m .start ()
230252 self ._workers [m .pid ] = m
231- logging .info ('minion added at: %s' % m .pid )
253+ self . logger .info ('minion added at: %s' % m .pid )
232254 return m
233255
234256 def _shutdown_minions (self ):
@@ -250,7 +272,7 @@ def _remove_minion(self, pid=None):
250272 return m
251273
252274 def unregister_khan (self ):
253- logging .debug ('unregistering khan' )
275+ self . logger .debug ('unregistering khan' )
254276 self .resq .redis .srem ('resque:khans' ,str (self ))
255277 self .started = None
256278
@@ -279,8 +301,8 @@ def __str__(self):
279301 return '%s:%s:%s' % (hostname , self .pid , self .pool_size )
280302
281303 @classmethod
282- def run (cls , pool_size = 5 , queues = [], server = 'localhost:6379' ):
283- worker = cls (pool_size = pool_size , queues = queues , server = server )
304+ def run (cls , pool_size = 5 , queues = [], server = 'localhost:6379' , logging_level = logging . INFO ):
305+ worker = cls (pool_size = pool_size , queues = queues , server = server , logging_level = logging_level )
284306 worker .work ()
285307
286308#if __name__ == "__main__":
0 commit comments