2013-03-13 119 views
3

如何从apscheduler捕获作业中的日志?在apscheduler中捕获日志

假设,我有以下工作

@sched.interval_schedule(hours=3) 
def some_job(): 
    log.info('I was here.') 
    log.info('And here.') 

与听众

sched.add_listener(job_listener, 
         events.EVENT_JOB_EXECUTED | 
         events.EVENT_JOB_MISSED | 
         events.EVENT_JOB_ERROR) 

def job_listener(event): 
    # how do I get the logged messages here? 

我如何可以访问job_listener消息?

回答

3

此使用线程可以做到安全的队列

import logging 

import Queue 
from apscheduler import events 
from apscheduler.scheduler import Scheduler 
import time 


#logging.basicConfig(level=logging.INFO,format='%(asctime)s : %(name)s : %(levelname)s : %(module)s.%(funcName)s(%(lineno)d) : %(thread)d %(threadName)s: %(message)s') 

#enable logger to see exceptions caught by apscheduler 
logging.basicConfig() 



q = Queue.Queue() 

sched = Scheduler() 


@sched.interval_schedule(seconds=1) 
def some_job(): 
    msg = "Decorated job : %s" % time.time() 
    print msg 
    logging.info(msg) 
    q.put(msg) 
    q.put("message 2") 


def job_listener(event): 
    #print str(event) 
    while not q.empty(): 
     get_ = "msg from job '%s': '%s'" % (event.job, q.get()) 
     print get_ 
     logging.info(get_) 


sched.add_listener(job_listener, 
        events.EVENT_JOB_EXECUTED | 
        events.EVENT_JOB_MISSED | 
        events.EVENT_JOB_ERROR) 

config = {'apscheduler.jobstores.file.class': 'apscheduler.jobstores.shelve_store:ShelveJobStore', 
      'apscheduler.jobstores.file.path': '/temp/dbfile'} 

sched.configure(config) 


sched.start() 

q.join() 
while True: 
    pass 

输出:

Decorated job : 1363960621.39 
msg from job 'some_job ...: 'Decorated job : 1363960621.39' 
msg from job 'some_job ...': 'message 2' 
Decorated job : 1363960622.4 
msg from job 'some_job ...: 'Decorated job : 1363960622.4' 
msg from job 'some_job ...: 'message 2' 
Decorated job : 1363960623.39 
+0

有一个竞争条件吗?我看不到队列中的消息是如何与作业实际关联的。作业1是否可能将消息放入队列中,然后作业2在另一个线程中执行,并且作业2的事件首先被触发,并且您看到它会打印来自作业1的消息“来自作业2的消息:”和旁边的消息? – dmd 2015-09-23 16:59:43

+0

是的,确认。不要使用上面的代码!如果您有多个作业同时运行,则不会得到与正确消息关联的正确作业ID。 – dmd 2015-09-23 17:20:09