2017-07-27 1 views
1

Wie verhindere ich doppelte Sellerie-Protokolle in einer Anwendung wie diesem?verhindern doppelte Sellerie Protokollierung

# test.py 
from celery import Celery 

import logging 

app = Celery('tasks', broker='redis://localhost:6379/0') 
app.logger = logging.getLogger("new_logger") 
file_handler = logging.handlers.RotatingFileHandler("app.log", maxBytes=1024*1024, backupCount=1) 
file_handler.setFormatter(logging.Formatter('custom_format %(message)s')) 
app.logger.addHandler(file_handler) 

@app.task 
def foo(x, y): 
    app.logger.info("log info from foo") 

beginne ich die Anwendung mit: celery -A test worker --loglevel=info --logfile celery.log

Dann verursachen ich foo mit python -c "from test import foo; print foo.delay(4, 4)"

ausgeführt werden Dies führt zu der "log info von foo" sowohl celery.log und app.log in angezeigt wird. Hier

app.log ist Inhalt:

custom_format log info from foo 

Und hier ist celery.log Inhalt:

[2017-07-26 21:17:24,962: INFO/MainProcess] Connected to redis://localhost:6379/0 
[2017-07-26 21:17:24,967: INFO/MainProcess] mingle: searching for neighbors 
[2017-07-26 21:17:25,979: INFO/MainProcess] mingle: all alone 
[2017-07-26 21:17:25,991: INFO/MainProcess] [email protected] ready. 
[2017-07-26 21:17:38,224: INFO/MainProcess] Received task: test.foo[e2c5e6aa-0d2d-4a16-978c-388a5e3cf162] 
[2017-07-26 21:17:38,225: INFO/ForkPoolWorker-4] log info from foo 
[2017-07-26 21:17:38,226: INFO/ForkPoolWorker-4] Task test.foo[e2c5e6aa-0d2d-4a16-978c-388a5e3cf162] succeeded in 0.000783085000876s: None 

Ich hielt die benutzerdefinierte Logger-Handler aus dem Python-Code zu entfernen, aber ich weiß nicht möchte nur sellery.log verwenden, da es keine rotierenden Dateien unterstützt. Ich erwog, Sellerie mit --logfile /dev/null zu starten, aber dann würde ich die Vermischung und andere Protokolle verlieren, die nicht in app.log angezeigt werden.

Kann ich verhindern, dass "log info from foo" in celery.log angezeigt wird? Vorausgesetzt, dass ich den Logger von Grund auf neu erstellt und nur die Protokollierung auf app.log eingerichtet habe, warum wird "log info from foo" in celery.log angezeigt?

Ist es möglich, die Sellerie MainProcess und Worker-Protokolle (zum Beispiel Connected to redis://localhost:6379/0) durch einen RotatingFileHandler angemeldet sein, zu erhalten (zum Beispiel in meinem app.log gehen)?

Antwort

2

Warum wird "log info from foo" in sellery.log angezeigt?

Das Logging-System ist im Grunde ein Baum von logginig.Logger Objekten mit Haupt logging.Logger in der Wurzel des Baumes (Sie die Wurzel mit Anruf erhalten logging.getLogger() ohne Parameter).

Wenn Sie logging.getLogger("child") aufrufen, erhalten Sie einen Verweis auf die logging.Logger Verarbeitung der "untergeordneten" Protokolle. Das Problem ist, wenn Sie logging.getLogger("child").info() aufrufen, wird die Informationsnachricht an das "Kind" aber auch an das Elternteil des "Kindes" und an sein Elternteil geliefert, bis es an den Stamm ankommt.

Um das Senden von Protokollen an die Eltern zu vermeiden, müssen Sie die logging.getLogger("child").propagate = False einrichten.

Verwandte Themen