2014-03-12 3 views
8

관리 명령을 실행하여 cron 스크립트로 실행중인 장고 프로젝트가 있습니다.셀러리 작업이 사라짐

for r in pr: 
    log_task(tasks_logger.info, "to_queue", r) 
    remind.delay(r, now, send_all) 

를 그리고 작업은 다음과 같습니다 :이 명령은 셀러리에 대한주기 작업에서 생성

class RTask(Task): 
    abstract = True 
    def on_failure(self, exc, task_id, args, kwargs, einfo): 
     r = args[0] 
     log_task(logger.error, exc, r) 
     log_task(logger_tb.error, einfo, r) 


@task(base=RTask) 
def remind(r, now, send_all): 
    log_task(logger.info, "from_queue", r) 
    .... 

u는 볼 수 있듯이, 내가 작업 실행 전에 그 안에 첫 번째 줄에 로거가있다. 문제는 - 다른 프로그래머가 다른 작업과 셀러리 버전 업데이트를 추가 한 프로젝트 코드를 업데이트 한 후 대부분의 작업이 소멸되기 시작합니다.

[2014-03-12 12:45:08,806] 106152122 INFO to_queue 
[2014-03-12 12:45:08,819] 106138932 INFO to_queue 
[2014-03-12 12:45:08,915] 106121944 INFO to_queue 
[2014-03-12 12:45:08,916] 110418819 INFO from_queue 
[2014-03-12 12:45:08,922] 106075777 INFO to_queue 

되지 않은 유용한 정보를 포함 할 셀러리 로그 파일 : 내 로그 파일 (실행 단지 1 8-10 작업) 다음과 같습니다. 토끼도 그렇게합니다. 그것은이 물건을 많이 가지고 있지만, 내 작업과 연결되어 있지 않습니까?

[2014-03-12 12:58:43,091: INFO/MainProcess] Got task from broker: celery.chord_unlock[7fe8f29f-69e1-456c-8a14-7fae0cfacc33] eta:[2014-03-12 12:58:44.089401+00:00] 
[2014-03-12 12:58:43,092: INFO/MainProcess] Task celery.chord_unlock[7fe8f29f-69e1-456c-8a14-7fae0cfacc33] retry: Retry in 1s 
[2014-03-12 12:58:43,092: INFO/MainProcess] Task celery.chord_unlock[7b1d4a6b-9a34-43e9-98c9-851c93ace5ce] retry: Retry in 1s 

무엇이 문제 일 수 있습니까? 작업이 사라질 때를 이해하기 위해 어떻게 추적 할 수 있습니까?

도와주세요 =)

+0

로그 북을 INFO 대신 DEBUG로 설정해 보았습니까? – olofom

+0

>> 로그 레벨을 INFO 대신 DEBUG로 설정해 보았습니까? 추가 정보 없음 = ( – shaihulud

+0

그것은 당신의 문제가 자세한 정보를 원하시면없이 무엇인지 말해 어렵다 list_queues' 첫 'rabbitmqctl을 시도하거나 당신이 가상 호스트를 사용하는 경우 :. 'rabbitmqctl의 list_queues -p ' 을하고 이러한 작업은 정말 어떻게해야합니까 것을 알 RabbitMQ에 저장됩니다. 그렇지 않으면 설정 파일을 다시 확인하십시오. django_celery를 사용하고 있다면, 이것을 설정에 추가해야합니다 : 'import djcelery; djcelery.setup_loader()'. BTW : 여러 작업자가 있고 같은 파일에 로깅하는 경우 일부 직원이 다른 사람의 회선을 덮어 쓰게되면 파일 잠금 문제가 발생할 수 있습니다. – seeg

답변

1

를 시작하기 전에 내 문제의 이유는 스레드로부터 안전하며 단일 프로세스에서 여러 스레드에서 단일 파일로 로깅이 지원됩니다. 다중 프로세스에서 단일 파일로 로깅은 지원되지 않습니다. Python의 여러 프로세스에서 단일 파일에 대한 액세스를 직렬화하는 표준 방법이 없으므로 . 여러 프로세스에서 하나의 파일에 로그해야하는 경우이 작업을 수행하는 한 가지 방법은 모든 프로세스를 SocketHandler에 기록하고 소켓에서 읽고 로그에 기록하는 소켓 서버를 구현하는 별도의 프로세스를 갖는 것입니다. (이 기능을 수행하기 위해 하나의 스레드를 기존 프로세스 중 하나에서 사용할 수 있습니다.)이 절에서는이 접근법에 대해보다 자세히 설명하고 작업 소켓 수신기를 포함합니다.이 소켓 수신기는 사용자가 자신의 응용 프로그램.
http://docs.python.org/2/howto/logging-cookbook.html#sending-and-receiving-logging-events-across-a-network
부하가 작을 때 모든 것이 완벽하게 작동했지만 그 증가로 문제가 발생했습니다.

5

그것은 당신이 셀러리 백그라운드에서 실행중인 프로세스, 메시지를 소비 할 수있는 제대로 종료되지 않은 이전 출시의 유물을 가능성이 있습니다. 명령 줄에서

ps aux | grep celery

을 실행하여 당신이 그런 노동자가 있는지 확인하려고합니다. 다음 명령은 자동으로 이러한 모든 고아 셀러리 노동자를 죽일 것이다 :
http://docs.python.org/2/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes
로깅이 있지만 :

ps aux | grep celery | awk '{system("kill -9 " $2)}'

내가 그것을 실행 내 응용 프로그램 여기에

관련 문제