work in progress: provide logging
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1918 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
c6980e85c7
commit
381ee37285
5 changed files with 62 additions and 5 deletions
|
@ -307,6 +307,11 @@ Configuration
|
||||||
- log format(s)
|
- log format(s)
|
||||||
- log file(s) (or other forms of persistence)
|
- log file(s) (or other forms of persistence)
|
||||||
|
|
||||||
|
>>> logger = agent.logger
|
||||||
|
>>> logger.log(dict(object='job', event='start'))
|
||||||
|
>>> print logger[-1]
|
||||||
|
20... event:start object:job
|
||||||
|
|
||||||
|
|
||||||
Software Loader
|
Software Loader
|
||||||
===============
|
===============
|
||||||
|
|
|
@ -27,6 +27,7 @@ from zope.interface import implements
|
||||||
from loops.agent.interfaces import IAgent
|
from loops.agent.interfaces import IAgent
|
||||||
from loops.agent.config import Configurator
|
from loops.agent.config import Configurator
|
||||||
from loops.agent.crawl import filesystem
|
from loops.agent.crawl import filesystem
|
||||||
|
from loops.agent.log import Logger
|
||||||
from loops.agent.schedule import Scheduler, Stopper
|
from loops.agent.schedule import Scheduler, Stopper
|
||||||
from loops.agent.transport import base
|
from loops.agent.transport import base
|
||||||
|
|
||||||
|
@ -48,11 +49,12 @@ class Agent(object):
|
||||||
transportTypes = transportTypes
|
transportTypes = transportTypes
|
||||||
|
|
||||||
def __init__(self, conf=None):
|
def __init__(self, conf=None):
|
||||||
config = self.config = Configurator('ui', 'crawl', 'transport')
|
config = self.config = Configurator('ui', 'crawl', 'transport', 'logger')
|
||||||
config.load(conf)
|
config.load(conf)
|
||||||
self.scheduler = Scheduler(self)
|
self.scheduler = Scheduler(self)
|
||||||
self.stopper = Stopper()
|
self.stopper = Stopper()
|
||||||
self.stopper.scheduler = self.scheduler
|
self.stopper.scheduler = self.scheduler
|
||||||
|
self.logger = Logger(self)
|
||||||
|
|
||||||
def scheduleJobsFromConfig(self):
|
def scheduleJobsFromConfig(self):
|
||||||
config = self.config
|
config = self.config
|
||||||
|
@ -71,7 +73,7 @@ class Agent(object):
|
||||||
transporter = factory(self)
|
transporter = factory(self)
|
||||||
# TODO: configure transporter or - better -
|
# TODO: configure transporter or - better -
|
||||||
# set up transporter(s) just once
|
# set up transporter(s) just once
|
||||||
job.successors.append(transporter.jobFactory(transporter))
|
job.successors.append(transporter.createJob())
|
||||||
job.repeat = info.repeat or 0
|
job.repeat = info.repeat or 0
|
||||||
self.scheduler.schedule(job, info.starttime or int(time()))
|
self.scheduler.schedule(job, info.starttime or int(time()))
|
||||||
# TODO: remove job from config
|
# TODO: remove job from config
|
||||||
|
|
|
@ -92,14 +92,30 @@ class IScheduledJob(Interface):
|
||||||
|
|
||||||
|
|
||||||
class ILogger(Interface):
|
class ILogger(Interface):
|
||||||
""" Collection of log records.
|
""" Ordered collection (list) of log records.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
externalLoggers = Attribute('A collection of logger objects '
|
||||||
|
'to which the logging records should be written.')
|
||||||
|
|
||||||
|
def log(data):
|
||||||
|
""" Record the information given by the ``data`` argument
|
||||||
|
(a mapping).
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
class ILogRecord(Interface):
|
class ILogRecord(Interface):
|
||||||
"""
|
"""
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
format = Attribute('An optional format string for rendering the '
|
||||||
|
'recorded information.')
|
||||||
|
|
||||||
|
def __str__():
|
||||||
|
""" Return a string representation suitable for writing on a
|
||||||
|
log file.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
class ICrawlingJob(IScheduledJob):
|
class ICrawlingJob(IScheduledJob):
|
||||||
""" Collects resources.
|
""" Collects resources.
|
||||||
|
|
34
agent/log.py
34
agent/log.py
|
@ -22,6 +22,40 @@ Log information management.
|
||||||
$Id$
|
$Id$
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import time
|
||||||
from zope.interface import implements
|
from zope.interface import implements
|
||||||
|
|
||||||
from loops.agent.interfaces import ILogger, ILogRecord
|
from loops.agent.interfaces import ILogger, ILogRecord
|
||||||
|
|
||||||
|
|
||||||
|
class LogRecord(object):
|
||||||
|
|
||||||
|
implements(ILogRecord)
|
||||||
|
|
||||||
|
format = None
|
||||||
|
timeFormat = '%Y-%m-%dT%H:%S'
|
||||||
|
|
||||||
|
def __init__(self, data):
|
||||||
|
self.data = data
|
||||||
|
self.timeStamp = time.time()
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
msg = [str(time.strftime(self.timeFormat, time.localtime(self.timeStamp)))]
|
||||||
|
for k in sorted(self.data):
|
||||||
|
msg.append('%s:%s' % (str(k), str(self.data[k])))
|
||||||
|
return ' '.join(msg)
|
||||||
|
|
||||||
|
|
||||||
|
class Logger(list):
|
||||||
|
|
||||||
|
implements(ILogger)
|
||||||
|
|
||||||
|
recordFactory = LogRecord
|
||||||
|
|
||||||
|
def __init__(self, agent, externalLoggers=[]):
|
||||||
|
self.agent = agent
|
||||||
|
self.externalLoggers = externalLoggers
|
||||||
|
|
||||||
|
def log(self, data):
|
||||||
|
self.append(self.recordFactory(data))
|
||||||
|
|
||||||
|
|
|
@ -50,8 +50,8 @@ class Scheduler(object):
|
||||||
reactor.callLater(startTime-int(time()), job.run)
|
reactor.callLater(startTime-int(time()), job.run)
|
||||||
return startTime
|
return startTime
|
||||||
|
|
||||||
def getJobsToExecute(startTime=None):
|
def getJobsToExecute(startTime=0):
|
||||||
return [j for j in self.queue.values() if (startTime or 0) <= j.startTime]
|
return [j for j in self.queue.values() if startTime <= j.startTime]
|
||||||
|
|
||||||
|
|
||||||
class Job(object):
|
class Job(object):
|
||||||
|
|
Loading…
Add table
Reference in a new issue