Skip to content

Commit 753b8a4

Browse files
author
Matt George
committed
Merge branch 'logging'
Conflicts: pyres/horde.py
2 parents 771329a + a50cfcd commit 753b8a4

File tree

6 files changed

+62
-21
lines changed

6 files changed

+62
-21
lines changed

pyres/__init__.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,27 @@
44
import pyres.json_parser as json
55

66
import time, datetime
7-
7+
import sys
88
import logging
99

10+
def setup_logging(log_level=logging.INFO, filename=None, stream=sys.stderr):
11+
if log_level == logging.NOTSET:
12+
return
13+
logger = logging.getLogger()
14+
logger.setLevel(log_level)
15+
if filename:
16+
try:
17+
from logging.handlers import WatchedFileHandler
18+
handler = WatchedFileHandler(filename)
19+
except:
20+
from logging.handlers import RotatingFileHandler
21+
handler = RotatingFileHandler(filename,maxBytes=52428800, backupCount=7)
22+
else:
23+
handler = logging.StreamHandler(strm=stream)
24+
handler.setFormatter(logging.Formatter(
25+
'%(asctime)s %(levelname)-8s %(message)s', '%Y-%m-%d %H:%M:%S'))
26+
logger.addHandler(handler)
27+
1028
def my_import(name):
1129
"""Helper function for walking import calls when searching for classes by string names."""
1230
mod = __import__(name)

pyres/horde.py

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def setup_logging(namespace='', log_level=logging.INFO, log_file=None):
3434
return logger
3535

3636
class Minion(multiprocessing.Process):
37-
def __init__(self, queues, server, password, log_level=logging.INFO, log_file=None):
37+
def __init__(self, queues, server, password, log_level=logging.INFO, log_path=None):
3838
multiprocessing.Process.__init__(self, name='Minion')
3939

4040
#format = '%(asctime)s %(levelname)s %(filename)s-%(lineno)d: %(message)s'
@@ -51,14 +51,13 @@ def __init__(self, queues, server, password, log_level=logging.INFO, log_file=No
5151
self.password = password
5252

5353
self.log_level = log_level
54-
self.log_file = log_file
54+
self.log_path = log_path
55+
self.log_file = None
5556

5657
def prune_dead_workers(self):
5758
pass
5859

5960
def schedule_shutdown(self, signum, frame):
60-
print signum,
61-
print 'inside shutdown'
6261
self._shutdown = True
6362

6463
def register_signal_handlers(self):
@@ -148,16 +147,25 @@ def work(self, interval=5):
148147
time.sleep(interval)
149148
self.unregister_minion()
150149

150+
def clear_logger(self):
151+
for handler in self.logger.handlers:
152+
self.logger.removeHandler(handler)
153+
151154
def run(self):
152155
setproctitle('pyres_minion:%s: Starting' % (os.getppid(),))
156+
if self.log_path:
157+
self.log_file = os.path.join(self.log_path, 'minion-%s.log' % self.pid)
158+
namespace = 'minion:%s' % self.pid
159+
self.logger = setup_logging(namespace, self.log_level, self.log_file)
160+
#self.clear_logger()
153161
if isinstance(self.server,basestring):
154162
self.resq = ResQ(server=self.server, password=self.password)
155163
elif isinstance(self.server, ResQ):
156164
self.resq = self.server
157165
else:
158166
raise Exception("Bad server argument")
159-
namespace = 'minion:%s' % self.pid
160-
self.logger = setup_logging(namespace, self.log_level, self.log_file)
167+
168+
161169
self.work()
162170
#while True:
163171
# job = self.q.get()
@@ -184,10 +192,11 @@ def __init__(self, pool_size=5, queues=[], server='localhost:6379', password=Non
184192
self.password = password
185193
self.logging_level = logging_level
186194
self.log_file = log_file
187-
self.logger = setup_logging('khan', self.logging_level, self.log_file)
195+
188196
#self._workers = list()
189197

190198
def setup_resq(self):
199+
self.logger.info('Connecting to redis server - %s' % self.server)
191200
if isinstance(self.server,basestring):
192201
self.resq = ResQ(server=self.server, password=self.password)
193202
elif isinstance(self.server, ResQ):
@@ -236,7 +245,6 @@ def _check_commands(self):
236245
command = self.resq.redis.lpop('resque:khan:%s' % str(self))
237246
self.logger.debug('COMMAND FOUND: %s ' % command)
238247
if command:
239-
import pdb;pdb.set_trace()
240248
self.process_command(command)
241249
self._check_commands()
242250

@@ -250,17 +258,23 @@ def process_command(self, command):
250258
fn()
251259

252260
def add_minion(self):
253-
m = self._add_minion()
261+
self._add_minion()
254262
self.resq.redis.srem('resque:khans',str(self))
255263
self.pool_size += 1
256264
self.resq.redis.sadd('resque:khans',str(self))
257265

258266
def _add_minion(self):
259-
self.logger.info('Adding minion')
260-
m = Minion(self.queues, self.server, self.password, log_level=self.logging_level)
267+
if hasattr(self,'logger'):
268+
self.logger.info('Adding minion')
269+
if self.log_file:
270+
log_path = os.path.dirname(self.log_file)
271+
else:
272+
log_path = None
273+
m = Minion(self.queues, self.server, self.password, log_level=self.logging_level, log_path=log_path)
261274
m.start()
262275
self._workers[m.pid] = m
263-
self.logger.info('minion added at: %s' % m.pid)
276+
if hasattr(self,'logger'):
277+
self.logger.info('minion added at: %s' % m.pid)
264278
return m
265279

266280
def _shutdown_minions(self):
@@ -295,9 +309,13 @@ def work(self, interval=2):
295309
setproctitle('pyres_manager: Starting')
296310
self.startup()
297311
self.setup_minions()
312+
self.logger = setup_logging('khan', self.logging_level, self.log_file)
313+
self.logger.info('Running as pid: %s' % self.pid)
314+
self.logger.info('Added %s child processes' % self.pool_size)
315+
self.logger.info('Setting up pyres connection')
298316
self.setup_resq()
299317
self.register_khan()
300-
setproctitle('pyres_manager: running - %s' % self.queues)
318+
setproctitle('pyres_manager: running %s' % self.queues)
301319
while True:
302320
self._check_commands()
303321
if self._shutdown:
@@ -314,8 +332,8 @@ def __str__(self):
314332
return '%s:%s:%s' % (hostname, self.pid, self.pool_size)
315333

316334
@classmethod
317-
def run(cls, pool_size=5, queues=[], server='localhost:6379', logging_level=logging.INFO):
318-
worker = cls(pool_size=pool_size, queues=queues, server=server, logging_level=logging_level)
335+
def run(cls, pool_size=5, queues=[], server='localhost:6379', logging_level=logging.INFO, log_file=None):
336+
worker = cls(pool_size=pool_size, queues=queues, server=server, logging_level=logging_level, log_file=log_file)
319337
worker.work()
320338

321339
#if __name__ == "__main__":

scripts/pyres_manager

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def main():
1717
parser.add_option("-i", '--interval', dest='interval', default=None, help='the default time interval to sleep between runs')
1818
parser.add_option('-l', '--log-level', dest='log_level', default='info', help='log level. Valid values are "debug", "info", "warning", "error", "critical", in decreasing order of verbosity. Defaults to "info" if parameter not specified.')
1919
parser.add_option("--pool", type="int", dest="pool_size", default=1, help="Number of minions to spawn under the manager.")
20+
parser.add_option('-f', dest='logfile', help='If present, a logfile will be used.')
2021
(options,args) = parser.parse_args()
2122

2223
if len(args) != 1:
@@ -32,7 +33,7 @@ def main():
3233

3334
queues = args[0].split(',')
3435
server = '%s:%s' % (options.host,options.port)
35-
Khan.run(pool_size=options.pool_size, queues=queues, server=server, logging_level=log_level)
36+
Khan.run(pool_size=options.pool_size, queues=queues, server=server, logging_level=log_level, log_file=options.logfile)
3637

3738
if __name__ == "__main__":
3839
main()

scripts/pyres_scheduler

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/usr/bin/env python
2+
from pyres import setup_logging
23
from pyres.scheduler import Scheduler
34
import logging
45

@@ -10,9 +11,11 @@ def main():
1011
parser.add_option("--host", dest="host", default="localhost")
1112
parser.add_option("--port",dest="port",type="int", default=6379)
1213
parser.add_option('-l', '--log-level', dest='log_level', default='info', help='log level. Valid values are "debug", "info", "warning", "error", "critical", in decreasing order of verbosity. Defaults to "info" if parameter not specified.')
14+
parser.add_option('-f', dest='logfile', help='If present, a logfile will be used.')
1315
(options,args) = parser.parse_args()
1416
log_level = getattr(logging, options.log_level.upper(),'INFO')
15-
logging.basicConfig(level=log_level, format="%(module)s: %(asctime)s: %(levelname)s: %(message)s")
17+
#logging.basicConfig(level=log_level, format="%(module)s: %(asctime)s: %(levelname)s: %(message)s")
18+
setup_logging(log_level=log_level, filename=options.logfile)
1619
server = '%s:%s' % (options.host, options.port)
1720
Scheduler.run(server)
1821

scripts/pyres_worker

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import logging
44

55
from optparse import OptionParser
66
from pyres.worker import Worker
7+
from pyres import setup_logging
78

89

910

@@ -16,15 +17,16 @@ def main():
1617
parser.add_option("--port",dest="port",type="int", default=6379)
1718
parser.add_option("-i", '--interval', dest='interval', default=None, help='the default time interval to sleep between runs')
1819
parser.add_option('-l', '--log-level', dest='log_level', default='info', help='log level. Valid values are "debug", "info", "warning", "error", "critical", in decreasing order of verbosity. Defaults to "info" if parameter not specified.')
20+
parser.add_option('-f', dest='logfile', help='If present, a logfile will be used.')
1921
(options,args) = parser.parse_args()
2022

2123
if len(args) != 1:
2224
parser.print_help()
2325
parser.error("Argument must be a comma seperated list of queues")
2426

2527
log_level = getattr(logging, options.log_level.upper(), 'INFO')
26-
logging.basicConfig(level=log_level, format="%(asctime)s: %(levelname)s: %(message)s")
27-
28+
#logging.basicConfig(level=log_level, format="%(asctime)s: %(levelname)s: %(message)s")
29+
setup_logging(log_level=log_level, filename=options.logfile)
2830
interval = options.interval
2931
if interval is not None:
3032
interval = float(interval)

tests/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ class Basic(object):
88
@staticmethod
99
def perform(name):
1010
s = "name:%s" % name
11-
print s
1211
return s
1312

1413
class BasicMulti(object):

0 commit comments

Comments
 (0)