it-swarm.com.de

Verwenden von Python Logging mit AWS Lambda

Wie aus der AWS-Dokumentation hervorgeht:

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')

Jetzt habe ich gemacht:

import logging
logging.basicConfig(level = logging.INFO)
logging.info("Hello World!")

Das erste Code-Snippet wird in der Cloud Watch-Konsole gedruckt, das zweite jedoch nicht.

Ich habe keinen Unterschied gesehen, da die beiden Snippets den Root-Logger verwenden.

26
p.magalhaes

Direkt von der obersten Antwort in den Frage-Link zu StevenBohrer kopiert (dies hat den Trick für mich gemacht, die letzte Zeile durch meine eigene Konfiguration zu ersetzen):

root = logging.getLogger()
if root.handlers:
    for handler in root.handlers:
        root.removeHandler(handler)
logging.basicConfig(format='%(asctime)s %(message)s',level=logging.DEBUG)
20
Brett Beatty

Ich hatte ein ähnliches Problem, und ich vermute, dass der Lambda-Container logging.basicConfig aufruft, um Handler hinzuzufügen, BEVOR der Lambda-Code importiert wird. Das scheint eine schlechte Form zu sein ...

Umgehung bestand darin, zu sehen, ob Root-Logger-Handler konfiguriert wurden. Wenn dies der Fall ist, entfernen Sie sie, fügen Sie meinen Formatierer und die gewünschte Protokollebene (mit basicConfig) hinzu und stellen Sie die Handler wieder her.

Lesen Sie diesen Artikel Python-Protokollierung, bevor Sie logging.basicConfig ausführen.

12
Steven Bohrer

Der Grund, warum die Protokollierung nicht zu funktionieren scheint, ist, dass die AWS Lambda Python Runtime konfiguriert einen Protokollierungshandler vor das je nach der Version der ausgewählten Laufzeit möglicherweise funktioniert Ändern Sie das Format der protokollierten Nachricht und fügen Sie ggf. auch einige Metadaten zum Datensatz hinzu. nicht Vorkonfiguriert ist jedoch die Protokollebene. Dies bedeutet, dass unabhängig von der Art der zu sendenden Protokollnachricht diese nicht gedruckt wird.

Als AWS-Dokumente selbst müssen Sie nur die Protokollebene für den Root-Logger festlegen, um die Bibliothek logging im AWS Lambda-Kontext korrekt zu verwenden:

import logging
logging.getLogger().setLevel(logging.INFO)

Wenn Sie möchten, dass Ihr Python-Skript sowohl unter AWS Lambda als auch mit Ihrem lokalen Python -Interpreter ausführbar ist, können Sie überprüfen, ob ein Handler konfiguriert ist, und auf basicConfig (erstellt den Standard-Stderr-Handler) andernfalls:

if len(logging.getLogger().handlers) > 0:
    # The Lambda environment pre-configures a handler logging to stderr. If a handler is already configured,
    # `.basicConfig` does not execute. Thus we set the level directly.
    logging.getLogger().setLevel(logging.INFO)
else:
    logging.basicConfig(level=logging.INFO)
4
Pit

Vermutlich nicht auf denselben Logger bezogen, tatsächlich . Protokollieren Sie im ersten Snippet die Rückgabe von: logging.Logger.manager.loggerDict

Es wird eine dict der bereits initialisierten Logger zurückgegeben.

Aus der logging-Dokumentation ein wichtiger Hinweis zu logging.basicConfig:

Ermöglicht die grundlegende Konfiguration des Protokollierungssystems, indem ein StreamHandler mit einem Standard-Formatter erstellt und zum Root-Logger hinzugefügt wird. Die Funktionen debug (), info (), warning (), error () und critical () rufen basicConfig () automatisch auf, wenn für den Root-Logger keine Handler definiert sind.

Diese Funktion funktioniert nicht, wenn für den Root-Logger bereits Handler konfiguriert sind.

Quelle: https://docs.python.org/2/library/logging.html#logging.basicConfig

3
HEADLESS_0NE

Ich habe mit genau diesem Problem zu kämpfen. Die Lösung, die sowohl lokal als auch unter AWS CloudWatch funktioniert, besteht darin, die Protokollierung folgendermaßen einzurichten:

import logging

# Initialize you log configuration using the base class
logging.basicConfig(level = logging.INFO)

# Retrieve the logger instance
logger = logging.getLogger()

# Log your output to the retrieved logger instance
logger.info("Python for the win!")

0
Kinman

Im Wesentlichen muss der AWS-Protokollierungs-Affen-Patch auf eine bestimmte Art und Weise behandelt werden. Dabei gilt Folgendes:

  1. Die Protokollebene wird von der TOP-Ebene des Skripts (z. B. zur Importzeit) festgelegt.
  2. Die Protokollanweisungen, an denen Sie interessiert sind, werden aus der Lambda-Funktion heraus aufgerufen

Da es generell als gute Form angesehen wird, im Python-Modul-Import nicht willkürlichen Code auszuführen, sollten Sie in der Regel in der Lage sein, Ihren Code so umzustrukturieren, dass das Heben nur innerhalb der Lambda-Funktion erfolgt.

0
Edward Z. Yang