Mit python-Logging mit AWS Lambda
Als der AWS-Dokumentation schlägt vor:
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def my_logging_handler(event, context):
logger.info('got event{}'.format(event))
logger.error('something went wrong')
Ich jetzt gemacht:
import logging
logging.basicConfig(level = logging.INFO)
logging.info("Hello World!")
Den ersten code-snippet Drucke in den Cloud Watch
Konsole, aber die zweite nicht.
Ich sehe keinen Unterschied, wie die beiden Ausschnitte sind mit dem root-logger.
- Sie fehlen "return 'Hallo Welt!'"
- Warum nicht das gleiche tun wie in der ersten code-snippet? Holen Sie sich die logger, die bereits instanziiert und verwenden Sie dann sagte logger.
- Ich kann die Faust eines. Aber ich würde gerne verstehen, warum dieses Verhalten.
- Auch Kasse python-cloud-logger auf pypi.org/project/python-cloud-logger. Es bietet Möglichkeiten, sich zu Kontext-logging, wo Anforderungs-id und andere Kontext-Variablen gespeichert werden können, um thread-Kontext. Und jeden melden würde der Kontext dann auf.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kopiert direkt aus dem top-Antwort in der Frage @StevenBohrer die Antwort von links (dies hat den trick für mich, ersetzen Sie die Letzte Zeile mit meiner eigenen config):
Ich hatte ein ähnliches problem, und ich vermute, dass die lambda-container ruft die Protokollierung.basicConfig Handler hinzuzufügen, BEVOR die lambda-code importiert wird. Dies scheint wie eine schlechte form...
Workaround war, um zu sehen, wenn root-logger-Handler konfiguriert wurden und falls ja, entfernen Sie Sie, fügen Sie meine formatter und die gewünschten log-level (mit basicConfig), und wiederherstellen Sie die Handler.
Finden Sie in diesem Artikel Python-logging, bevor Sie laufen, protokollieren.basicConfig?
Wahrscheinlich nicht, verweisen auf die gleichen logger, eigentlich.
In der ersten snippet, melden Sie die Rücksendung an:
logging.Logger.manager.loggerDict
Wird es wieder ein
dict
der Logger bereits initialisiert.Auch, von der
logging
Dokumentation, ein wichtiger Hinweis auflogging.basicConfig
:Quelle: https://docs.python.org/2/library/logging.html#logging.basicConfig
[DEBUG] 2016-10-29T09:01:28.376Z 45e6c8bd-9db6-11e6-aa56-43d43acb066b Acquiring 0 [DEBUG] 2016-10-29T09:01:28.389Z 45e6c8bd-9db6-11e6-aa56-43d43acb066b IOWriteTask({'offset': 0}) about to wait for the following futures [] [DEBUG] 2016-10-29T09:01:28.389Z 45e6c8bd-9db6-11e6-aa56-43d43acb066b IOWriteTask({'offset': 0}) done waiting for dependent futures
Dem Grund, dass die Anmeldung nicht zu funktionieren scheint ist, weil die AWS Lambda-Python-runtime pre-konfiguriert eine logging-handler, dass, abhängig von der version der Laufzeitumgebung ausgewählt, ändern Sie das format der Nachricht protokolliert, und vielleicht auch einige Metadaten zum Datensatz, wenn verfügbar. Was ist nicht jedoch schon vorkonfiguriert, ist der log-level. Dies bedeutet, dass unabhängig von der Art der log-Nachricht, die Sie versuchen zu senden, wird es nicht tatsächlich drucken.
Als AWS-Dokumente selbst, um richtig mit der
logging
Bibliothek in der AWS Lambda-Kontext, müssen Sie nur setzen Sie den log-level für den root-logger:Wenn Sie möchten, dass Ihre Python-Skript werden sowohl ausführbare Datei auf AWS Lambda, aber auch mit Ihrem lokalen Python-interpreter, können Sie überprüfen, ob ein handler konfiguriert ist oder nicht, und fallen zurück
basicConfig
(die schafft der Standard-stderr-handler) ansonsten:Im wesentlichen die AWS-Protokollierung monkey patch verarbeitet werden muss in einer ganz besonderen Weise, wo:
Da es im Allgemeinen als gute form nicht ausführen von beliebigem code in Python-Modul importieren, Sie sollten in der Regel in der Lage sein, neu zu strukturieren Sie Ihren code so, dass das heben schwerer tritt nur innerhalb der lambda-Funktion.
Habe ich gekämpft mit genau diesem problem. Die Lösung funktioniert sowohl lokal als auch über AWS CloudWatch, um das setup log wie diesen: