Django Sellerie Logging Best Practice
Ich versuche, Sellerie Protokollierung der Arbeit mit Django
. Ich habe die Protokollierung set-up in settings.py
gehen auf die Konsole (das funktioniert so wie ich bin-hosting auf Heroku
). An der Spitze der einzelnen module, die ich habe:
import logging
logger = logging.getLogger(__name__)
Und in meinem tasks.py habe ich:
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
Das funktioniert auch für die Anmeldung fordert von einer Aufgabe und bekomme ich eine Ausgabe wie diese:
2012-11-13T18:05:38+00:00 app[worker.1]: [2012-11-13 18:05:38,527: INFO/PoolWorker-2] Syc feed is starting
Aber wenn die Aufgabe dann ruft eine Methode in einem anderen Modul, z.B. ein queryset
Methode, bekomme ich doppelte Einträge im log, z.B.
2012-11-13T18:00:51+00:00 app[worker.1]: [INFO] utils.generic_importers.ftp_processor process(): File xxx.csv already imported. Not downloaded
2012-11-13T18:00:51+00:00 app[worker.1]: [2012-11-13 18:00:51,736: INFO/PoolWorker-6] File xxx.csv already imported. Not downloaded
Ich denke, dass ich verwenden könnte,
CELERY_HIJACK_ROOT_LOGGER = False
einfach die Django
Protokollierung aber das hat nicht funktioniert als ich es versucht habe und selbst wenn ich habe es zu arbeiten, ich würde verlieren die "PoolWorker-6"
bit, was ich tun soll. (Übrigens, ich kann nicht herausfinden, wie man den Namen der Aufgabe, um die Anzeige in der log-Eintrag von Sellerie, wie die docs scheint zu zeigen, dass Sie es sollten).
Ich vermute, ich bin etwas fehlt einfach hier.
InformationsquelleAutor der Frage alan | 2012-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr logger initialisiert am Anfang von "ein Modul" links zu anderen logger. Die Bearbeitung Ihrer Nachrichten. Es kann root logger, oder normalerweise sehe ich in Django-Projekte - logger mit dem Namen
''
.Beste Weg hier ist, ist das überschreiben Ihre logging config:
In diesem Fall nehme ich an es sollte so funktionieren, wie Sie annehmen.
P. S. dictConfig Hinzugefügt Python2.7+.
InformationsquelleAutor der Antwort Rustem
Es ist beunruhigend, dass Sellerie mischt mit dem root-logger (das ist nicht best practice und kann nicht kontrolliert werden, vollständig), aber es tut nicht deaktivieren, die Ihre app benutzerdefinierte Logger in irgendeiner Weise, so verwenden Sie Ihren eigenen handler-Namen und definieren Sie Ihr eigenes Verhalten, anstatt zu versuchen, um dieses Problem zu beheben mit Sellerie. [Ich mag, um meine Anwendung Protokollierung separate sowieso). Könnten Sie separate Handler oder der gleichen für den Django-code und Sellerie Aufgaben, die Sie gerade brauchen, um zu definieren, Sie in Ihren Django-LOGGING config. Hinzufügen Formatierung args für das Modul, mit dem Namen und Prozessnamen zu Ihrem formatter for sanity, um Ihnen zu helfen, zu unterscheiden, wo Nachrichten entstehen.
[dies setzt Voraus, Sie haben die Einrichtung zu einem handler für "yourapp" in der LOGGING-Einstellungen, Wert-Punkte auf ein Appender - klingt wie Sie wissen, dies aber nicht].
views.py
tasks.py
Für die Protokollierung, die Sellerie wird - bei Nutzung der celeryd flags --logfile zu senden Sellerie-Ausgang (z.B. Arbeiter init started task, task fehlgeschlagen) an einem separaten Ort, wenn gewünscht. Oder nutzen die anderen hier beantworten, sendet die 'Sellerie' logger in eine Datei Ihrer Wahl.
Hinweis: würde ich nicht verwenden, RotatingFileHandlers - Sie werden nicht unterstützt für multi-Prozess-Anwendungen. Log-rotation aus einem anderen tool wie "logrotate" ist sicherer, das gleiche gilt für die Protokollierung von Django-vorausgesetzt, Sie haben mehrere Prozesse gibt, oder die gleichen log-Dateien werden gemeinsam mit den Sellerie Arbeitnehmer. Wenn Ihr mit einem multi-server-Lösung, die Sie wahrscheinlich wollen, um zu protokollieren, irgendwo zentralisiert sowieso.
InformationsquelleAutor der Antwort Lincoln B
Fix doppelte logging-Problem, was für mich gearbeitet ist, um das zu propagieren, "false", wenn man erklärt, "meine Einstellungen".PROTOKOLLIERUNG dict
lets sagen, dass Ihre django Projekt-layout sieht wie folgt aus:
my_project/
- tasks.py
- email.py
und können sagen, eine Ihrer Aufgaben macht einen Aufruf an eine Funktion in email.py; die Protokollierung wird passieren email.py und dann, dass die Protokollierung erhalten vermehrt auf die 'parent' - was in diesem Fall passiert, werden Ihre Sellerie Aufgabe. Also doppelt Protokollierung. Aber die Einstellung zu propagieren, Falsch für einen bestimmten logger bedeutet, dass für diesen logger/app, seine Protokolle nicht bekommen, weitergegeben an die Eltern, damit Ihr keine "Doppel" - Protokollierung.
Standardmäßig "verbreiten" wird auf True gesetzt
Hier ein link zu den django-docs Abschnitt über das Eltern/Kinder-Logger Zeug
InformationsquelleAutor der Antwort Komu