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:
helmutm 2007-08-14 09:13:19 +00:00
parent c6980e85c7
commit 381ee37285
5 changed files with 62 additions and 5 deletions

View file

@ -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
=============== ===============

View file

@ -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

View file

@ -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.

View file

@ -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))

View file

@ -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):