2013-03-13 5 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

Это может быть сделано с помощью Thread Safe Queue

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 срабатывает первым, и вы видите, что оно печатает «msg from job 2:» вместе с сообщением из задания 1? – dmd

+0

Да, подтверждено. Не используйте вышеуказанный код! Если у вас одновременно запущено несколько заданий, вы не получите правильный идентификатор задания, связанный с правильным сообщением. – dmd