Verwenden von Amazon CloudWatch -Protokollen mit AWS Lambda - AWS Lambda

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden von Amazon CloudWatch -Protokollen mit AWS Lambda

AWS Lambda überwacht automatisch Lambda-Funktionen in Ihrem Namen, um Sie bei der Behebung von Funktionsfehlern zu unterstützen. Solange die Ausführungsrolle Ihrer Funktion über die erforderlichen Berechtigungen verfügt, erfasst Lambda Protokolle für alle Anforderungen, die von Ihrer Funktion verarbeitet werden, und sendet sie an Amazon CloudWatch Logs.

Sie können Protokollierungsanweisungen in Ihren Code einfügen, damit Sie überprüfen können, ob Ihr Code wie erwartet funktioniert. Lambda lässt sich automatisch in - CloudWatch Protokolle integrieren und sendet alle Protokolle aus Ihrem Code an eine CloudWatch Protokollgruppe, die einer Lambda-Funktion zugeordnet ist.

Standardmäßig sendet Lambda Protokolle an eine Protokollgruppe mit dem Namen /aws/lambda/<function name>. Wenn Sie möchten, dass Ihre Funktion Protokolle an eine andere Gruppe sendet, können Sie dies mit der Lambda-Konsole, der AWS Command Line Interface (AWS CLI) oder der Lambda-API konfigurieren. Weitere Informationen hierzu finden Sie unter Konfigurieren von CloudWatch Protokollgruppen.

Sie können Protokolle für Lambda-Funktionen mithilfe der Lambda-Konsole, der CloudWatch Konsole, der AWS Command Line Interface (AWS CLI) oder der CloudWatch API anzeigen.

Anmerkung

Es kann 5 bis 10 Minuten dauern, bis Protokolle nach einem Funktionsaufruf angezeigt werden.

Voraussetzungen

Ihre Ausführungsrolle benötigt die Berechtigung zum Hochladen von Protokollen in CloudWatch -Protokolle. Sie können CloudWatch Protokollberechtigungen mithilfe der von Lambda bereitgestellten AWSLambdaBasicExecutionRole AWS verwalteten Richtlinie hinzufügen. Führen Sie den folgenden Befehl aus, um diese Richtlinie zu Ihrer Rolle hinzuzufügen:

aws iam attach-role-policy --role-name your-role --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

Weitere Informationen finden Sie unter AWS-verwaltete Richtlinien für Lambda-Funktionen.

Preisgestaltung

Für die Verwendung von Lambda-Protokollen fallen keine zusätzlichen Gebühren an. Es fallen jedoch Standardgebühren für CloudWatch Protokolle an. Weitere Informationen finden Sie unter -CloudWatch Preise.

Konfigurieren erweiterter Protokollierungsoptionen für die Lambda-Funktion

Um Ihnen mehr Kontrolle darüber zu geben, wie die Protokolle Ihrer Funktionen erfasst, verarbeitet und verwendet werden, bietet Lambda folgende Konfigurationsoptionen für die Protokollierung:

  • Protokollformat – Wählen Sie zwischen Klartext und einem strukturierten JSON-Format für die Protokolle Ihrer Funktion aus.

  • Protokollebene – Wählen Sie für strukturierte JSON-Protokolle die Detailebene der Protokolle aus, die Lambda an sendet CloudWatch, z. B. ERROR, DEBUG oder INFO

  • Protokollgruppe – Wählen Sie die CloudWatch Protokollgruppe aus, an die Ihre Funktion Protokolle sendet

Konfiguration der JSON- und Klartext-Protokollformate

Das Erfassen Ihrer Protokollausgaben als JSON-Schlüssel-Wert-Paare erleichtert das Suchen und Filtern beim Debuggen Ihrer Funktionen. Mit Protokollen im JSON-Format können Sie Ihren Protokollen auch Tags und Kontextinformationen hinzufügen. Das kann Ihnen bei der automatisierten Analyse großer Mengen von Protokolldaten helfen. Sofern Ihr Entwicklungsworkflow nicht auf vorhandenen Tools basiert, die Lambda-Protokolle im Klartext verarbeiten, empfehlen wir Ihnen, JSON als Protokollformat auszuwählen.

Für alle von Lambda verwalteten Laufzeiten können Sie wählen, ob die Systemprotokolle Ihrer Funktion im unstrukturierten Klartext- oder JSON-Format an CloudWatch Protokolle gesendet werden. Systemprotokolle sind die von Lambda generierten Protokolle und werden manchmal auch als Plattformereignisprotokolle bezeichnet.

Wenn Sie für unterstützte Laufzeiten eine der unterstützten integrierten Protokollierungsmethoden verwenden, kann Lambda auch die Anwendungsprotokolle Ihrer Funktion (die Protokolle, die Ihr Funktionscode generiert) im strukturierten JSON-Format ausgeben. Wenn Sie das Protokollformat Ihrer Funktion für diese Laufzeiten konfigurieren, gilt die von Ihnen ausgewählte Konfiguration sowohl für System- als auch für Anwendungsprotokolle.

Wenn Ihre Funktion für unterstützte Laufzeiten eine unterstützte Protokollierungsbibliothek oder -methode verwendet, müssen Sie keine Änderungen an Ihrem vorhandenen Code vornehmen, damit Lambda Protokolle in strukturiertem JSON erfasst.

Anmerkung

Durch die Verwendung der JSON-Protokollformatierung werden zusätzliche Metadaten hinzugefügt und Protokollmeldungen als JSON-Objekte kodiert, die eine Reihe von Schlüssel-Wert-Paaren enthalten. Aus diesem Grund kann die Größe der Protokollmeldungen Ihrer Funktion zunehmen.

Unterstützte Laufzeiten und Protokollierungsmethoden

Lambda unterstützt derzeit die Option, strukturierte JSON-Anwendungsprotokolle für folgende Laufzeiten auszugeben.

Laufzeit Unterstützte Versionen
Java Alle Java-Laufzeiten außer Java 8 auf Amazon Linux 1
Node.js Node.js 16 und höher
Python Python 3.7 oder höher

Damit Lambda die Anwendungsprotokolle Ihrer Funktion CloudWatch im strukturierten JSON-Format an senden kann, muss Ihre Funktion die folgenden integrierten Protokollierungstools verwenden, um Protokolle auszugeben:

  • Java – der LambdaLogger-Logger oder Log4j2.

  • Node.js – die Konsolenmethoden console.trace, console.debug, console.log, console.info, console.error und console.warn

  • Python – die logging-Standard-Python-Bibliothek

Weitere Hinweise zur Verwendung erweiterter Protokollierungsoptionen mit unterstützten Laufzeiten finden Sie unter AWS Lambda -Funktionsprotokollierung in Java, AWS Lambda-Funktionsprotokollierung in Node.js und AWS Lambda-Funktionsprotokollierung in Python.

Für andere verwaltete Lambda-Laufzeiten unterstützt Lambda derzeit nur nativ die Erfassung von Systemprotokollen im strukturierten JSON-Format. Sie können jedoch weiterhin Anwendungsprotokolle im strukturierten JSON-Format zu jeder Laufzeit erfassen, indem Sie Protokollierungstools wie Powertools for AWS Lambda verwenden, die Protokollausgaben im JSON-Format ausgeben.

Standardprotokollformate

Derzeit ist das Standard-Protokollformat für alle Lambda-Laufzeiten das Klartextformat.

Wenn Sie bereits Protokollierungsbibliotheken wie Powertools for AWS Lambda für die Generierung Ihrer Funktionsprotokolle im strukturierten JSON-Format verwenden, müssen Sie Ihren Code nicht ändern, wenn Sie die JSON-Protokollformatierung auswählen. Lambda codiert Protokolle, die bereits JSON-codiert sind, nicht doppelt, sodass die Anwendungsprotokolle Ihrer Funktion weiterhin wie zuvor erfasst werden.

JSON-Format für Systemprotokolle

Wenn Sie das Protokollformat Ihrer Funktion als JSON konfigurieren, wird jedes Systemprotokollelement (Plattformereignis) als JSON-Objekt erfasst, das Schlüssel-Wert-Paare mit den folgenden Schlüsseln enthält:

  • "time" – die Uhrzeit, zu der die Protokollmeldung generiert wurde

  • "type" – die Art des Ereignisses, das protokolliert wird

  • "record" – der Inhalt der Protokollausgabe

Das Format des "record"-Werts hängt von der Art des protokollierten Ereignisses ab. Weitere Informationen finden Sie unter Telemetrie-API Event-Objekttypen. Weitere Hinweise zu den Protokollebenen, die Systemprotokollereignissen zugewiesen sind, finden Sie unter Zuordnung von Ereignissen auf Systemprotokollebene.

Zum Vergleich zeigen die folgenden beiden Beispiele dieselbe Protokollausgabe sowohl im Klartext- als auch im strukturierten JSON-Format. Beachten Sie, dass Systemprotokollereignisse in den meisten Fällen mehr Informationen enthalten, wenn sie im JSON-Format ausgegeben werden, als wenn sie im Klartext ausgegeben werden.

Beispiel Klartext:
2023-03-13 18:56:24.046000 fbe8c1 INIT_START Runtime Version: python:3.9.v18 Runtime Version ARN: arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0
Beispiel strukturiertes JSON:
{ "time": "2023-03-13T18:56:24.046Z", "type": "platform.initStart", "record": { "initializationType": "on-demand", "phase": "init", "runtimeVersion": "python:3.9.v18", "runtimeVersionArn": "arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0" } }
Anmerkung

Die Lambda-Telemetrie-API gibt immer Plattformereignisse wie START und REPORT im JSON-Format aus. Die Konfiguration des Formats der Systemprotokolle, die Lambda an sendet, wirkt sich nicht auf das Verhalten der Lambda-Telemetrie-API CloudWatch aus.

JSON-Format für Anwendungsprotokolle

Wenn Sie das Protokollformat Ihrer Funktion als JSON konfigurieren, werden Anwendungsprotokollausgaben, die mit unterstützten Protokollierungsbibliotheken und -methoden geschrieben wurden, als JSON-Objekt erfasst, das Schlüssel-Wert-Paare mit folgenden Schlüsseln enthält.

  • "timestamp" – die Uhrzeit, zu der die Protokollmeldung generiert wurde

  • "level" – die der Meldung zugewiesene Protokollebene

  • "message" – der Inhalt der Protokollmeldung

  • "requestId" (Python und Node.js) oder "AWSrequestId" (Java) – die eindeutige Anforderungs-ID für den Funktionsaufruf

Abhängig von der Laufzeit und der Protokollierungsmethode, die Ihre Funktion verwendet, kann dieses JSON-Objekt auch zusätzliche Schlüsselpaare enthalten. Wenn Sie Node.js verwenden und Ihre Funktion beispielsweise console-Methoden nutzt, um Fehlerobjekte mit mehreren Argumenten zu protokollieren, enthält das JSON-Objekt zusätzliche Schlüssel-Wert-Paare mit den Schlüsseln errorMessage, errorType und stackTrace. Weitere Informationen zu JSON-formatierten Protokollen in verschiedenen Lambda-Laufzeiten finden Sie unter AWS Lambda-Funktionsprotokollierung in Python, AWS Lambda-Funktionsprotokollierung in Node.js und AWS Lambda -Funktionsprotokollierung in Java.

Anmerkung

Der Schlüssel, den Lambda für den Zeitstempelwert verwendet, unterscheidet sich für Systemprotokolle und für Anwendungsprotokolle. Bei Systemprotokollen verwendet Lambda den Schlüssel "time", um die Konsistenz mit der Telemetrie-API aufrechtzuerhalten. Bei Anwendungsprotokollen folgt Lambda den Konventionen der unterstützten Laufzeiten und verwendet "timestamp".

Zum Vergleich zeigen die folgenden beiden Beispiele dieselbe Protokollausgabe sowohl im Klartext- als auch im strukturierten JSON-Format.

Beispiel Klartext:
2023-10-27T19:17:45.586Z 79b4f56e-95b1-4643-9700-2807f4e68189 INFO some log message
Beispiel strukturiertes JSON:
{ "timestamp":"2023-10-27T19:17:45.586Z", "level":"INFO", "message":"some log message", "requestId":"79b4f56e-95b1-4643-9700-2807f4e68189" }

Festlegen des Protokollformats Ihrer Funktion

Um das Protokollformat für Ihre Funktion zu konfigurieren, können Sie die Lambda-Konsole oder die AWS Command Line Interface (AWS CLI) verwenden. Sie können das Protokollformat einer Funktion auch mithilfe der UpdateFunctionConfiguration Lambda-API-Befehle CreateFunction und , der AWS Serverless Application Model (AWS SAM)-AWS::Serverless::FunctionRessource und der -AWS CloudFormationAWS::Lambda::FunctionRessource konfigurieren.

Das Ändern des Protokollformats Ihrer Funktion wirkt sich nicht auf vorhandene Protokolle aus, die in - CloudWatch Protokollen gespeichert sind. Nur neue Protokolle verwenden das aktualisierte Format.

Wenn Sie das Protokollformat Ihrer Funktion in JSON ändern und keine Protokollebene festlegen, setzt Lambda die Anwendungsprotokollebene und die Systemprotokollebene Ihrer Funktion automatisch auf INFO. Das bedeutet, dass Lambda nur Protokollausgaben der Stufe INFO und niedriger an CloudWatch Logs sendet. Weitere Informationen zur Filterung auf Anwendungs- und Systemprotokollebene finden Sie unter Filterung auf Protokollebene

Anmerkung

Wenn das Protokollformat Ihrer Funktion auf Klartext gesetzt ist, ist die Standardeinstellung auf Protokollebene für Python-Laufzeiten WARN. Das bedeutet, dass Lambda nur Protokollausgaben der Ebene WARN und niedriger an CloudWatch Protokolle sendet. Wenn Sie das Protokollformat Ihrer Funktion in JSON ändern, ändert sich dieses Standardverhalten. Weitere Informationen zur Protokollierung in Python finden Sie unter AWS Lambda-Funktionsprotokollierung in Python.

Bei Node.js-Funktionen, die Protokolle im eingebetteten Metrikformat (EMF) ausgeben, kann das Ändern des Protokollformats Ihrer Funktion in JSON dazu führen CloudWatch , dass Ihre Metriken nicht erkannt werden.

Wichtig

Wenn Ihre Funktion Powertools für AWS Lambda (TypeScript) oder die Open-Source-EMF-Clientbibliotheken verwendet, um EMF-Protokolle auszugeben, aktualisieren Sie Ihre Powertools- und EMF-Bibliotheken auf die neuesten Versionen, um sicherzustellen, dass Ihre Protokolle weiterhin korrekt analysieren CloudWatch kann. Wenn Sie zum JSON-Protokollformat wechseln, empfehlen wir Ihnen zudem, Tests durchzuführen, um die Kompatibilität mit den eingebetteten Metriken Ihrer Funktion sicherzustellen. Weitere Hinweise zu den Funktionen von node.js, die EMF-Protokolle ausgeben, finden Sie unter Verwenden von Clientbibliotheken im Embedded Metric Format (EMF) mit strukturierten JSON-Protokollen.

So konfigurieren Sie das Protokollformat einer Funktion (Konsole)
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Auswählen einer Funktion

  3. Wählen Sie auf der Konfigurationsseite der Funktion die Option Überwachungs- und Betriebstools aus.

  4. Wählen Sie im Bereich Protokollierungskonfiguration die Option Bearbeiten aus.

  5. Wählen Sie unter Protokollinhalt für Protokollformat entweder Text oder JSON aus.

  6. Wählen Sie Speichern.

So ändern Sie das Protokollformat einer vorhandenen Funktion (AWS CLI)
  • Verwenden Sie den Befehl update-function-configuration, um das Protokollformat einer vorhandenen Funktion zu ändern. Legen Sie die LogFormat-Option in LoggingConfig entweder auf JSON oder Text fest.

    aws lambda update-function-configuration \ --function-name myFunction --logging-config LogFormat=JSON
So legen Sie das Protokollformat fest, wenn Sie eine Funktion erstellen (AWS CLI)
  • Verwenden Sie die Option --logging-config im Befehl create-function, um das Protokollformat zu konfigurieren, wenn Sie eine neue Funktion erstellen. Legen Sie LogFormat auf JSON oder Text fest. Mit dem folgenden Beispielbefehl wird mithilfe der Laufzeit Node.js 18 eine Funktion erstellt, die Protokolle in strukturiertem JSON ausgibt.

    Wenn Sie beim Erstellen einer Funktion kein Protokollformat angeben, verwendet Lambda das Standardprotokollformat für die von Ihnen ausgewählte Laufzeitversion. Informationen zu den Standard-Protokollierungsformaten finden Sie unter Standardprotokollformate.

    aws lambda create-function --function-name myFunction --runtime nodejs18.x \ --handler index.handler --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole --logging-config LogFormat=JSON

Filterung auf Protokollebene

Lambda kann die Protokolle Ihrer Funktion filtern, sodass nur Protokolle einer bestimmten Detailebene oder niedriger an CloudWatch Protokolle gesendet werden. Sie können die Filterung auf Protokollebene separat für die Systemprotokolle Ihrer Funktion (die von Lambda generierten Protokolle) und Anwendungsprotokolle (die von Ihrem Funktionscode generierten Protokolle) konfigurieren.

Für Unterstützte Laufzeiten und Protokollierungsmethoden müssen Sie keine Änderungen an Ihrem Funktionscode vornehmen, damit Lambda die Anwendungsprotokolle Ihrer Funktion filtert.

Für alle anderen Laufzeiten und Protokollierungsmethoden muss Ihr Funktionscode Protokollereignisse in stdout oder stderr als JSON-formatierte Objekte ausgeben, die ein Schlüssel-Wert-Paar mit dem Schlüssel "level" enthalten. Lambda interpretiert beispielsweise die folgende Ausgabe an stdout als ein Protokoll auf Ebene DEBUG.

print('{"level": "debug", "msg": "my debug log", "timestamp": "2023-11-02T16:51:31.587199Z"}')

Wenn das Feld für den "level"-Wert ungültig ist oder fehlt, weist Lambda der Protokollausgabe die Ebene INFO zu. Damit Lambda das Zeitstempelfeld verwenden kann, müssen Sie die Zeit im gültigen RFC 3339-Zeitstempelformat angeben. Wenn Sie keinen gültigen Zeitstempel angeben, weist Lambda dem Protokoll die Ebene INFO zu und fügt einen Zeitstempel für Sie hinzu.

Halten Sie sich bei der Benennung des Zeitstempelschlüssels an die Benennungskonventionen der Laufzeit, die Sie verwenden. Lambda unterstützt die meisten gängigen Namenskonventionen, die von den verwalteten Laufzeiten verwendet werden. In Funktionen, die die .NET-Laufzeit verwenden, erkennt Lambda beispielsweise den Schlüssel "Timestamp".

Anmerkung

Um die Filterung auf Protokollebene verwenden zu können, muss Ihre Funktion für die Verwendung des JSON-Protokollformats konfiguriert sein. Derzeit ist das Standard-Protokollformat für alle verwalteten Lambda-Laufzeiten das Klartextformat. Informationen zur Konfiguration des JASON-Protokollformats Ihrer Funktion finden Sie unter Festlegen des Protokollformats Ihrer Funktion.

Bei Anwendungsprotokollen (den durch Ihren Funktionscode generierten Protokollen) können Sie zwischen den folgenden Protokollebenen wählen.

Protokollebene Standardnutzung
TRACE (am detailliertesten) Die detailliertesten Informationen, die verwendet werden, um den Ausführungspfad Ihres Codes nachzuverfolgen
DEBUG Detaillierte Informationen für das System-Debugging
INFO Meldungen, die den normalen Betrieb Ihrer Funktion erfassen
WARN Meldungen über mögliche Fehler, die zu unerwartetem Verhalten führen können, wenn sie nicht behoben werden
ERROR Meldungen über Probleme, die verhindern, dass der Code wie erwartet funktioniert
FATAL (am wenigsten Details) Meldungen über schwerwiegende Fehler, die dazu führen, dass die Anwendung nicht mehr funktioniert

Wenn Sie eine Protokollebene auswählen, sendet Lambda Protokolle auf dieser Ebene und niedriger an CloudWatch Protokolle. Wenn Sie beispielsweise die Anwendungsprotokollebene einer Funktion auf WARN setzen, sendet Lambda keine Protokollausgaben auf den Protokollebenen INFO und DEBUG. Die Standardebene des Anwendungsprotokolls für die Protokollfilterung ist INFO.

Wenn Lambda die Anwendungsprotokolle Ihrer Funktion filtert, wird Protokollmeldungen ohne Ebene die Protokollebene INFO zugewiesen.

Für Systemprotokolle (die vom Lambda-Service generierten Protokolle) können Sie zwischen den folgenden Protokollebenen wählen.

Protokollebene Verwendung
DEBUG (am detailliertesten) Detaillierte Informationen für das System-Debugging
INFO Meldungen, die den normalen Betrieb Ihrer Funktion erfassen
WARN (am wenigsten Details) Meldungen über mögliche Fehler, die zu unerwartetem Verhalten führen können, wenn sie nicht behoben werden

Wenn Sie eine Protokollebene auswählen, sendet Lambda Protokolle auf dieser Ebene und niedriger. Wenn Sie beispielsweise die Protokollebene einer Funktion auf INFO setzen, sendet Lambda keine Protokollausgaben auf der Protokollebene DEBUG.

Standardmäßig setzt Lambda die Protokollebene des Systems auf INFO. Mit dieser Einstellung sendet Lambda automatisch - "start" und -"report"Protokollnachrichten an CloudWatch. Um mehr oder weniger detaillierte Systemprotokolle zu erhalten, ändern Sie die Protokollebene in DEBUG oder WARN. Eine Liste der Protokollebenen, denen Lambda verschiedene Systemprotokollereignisse zuordnet, finden Sie unter Zuordnung von Ereignissen auf Systemprotokollebene.

Konfigurieren der Filterung auf Protokollebene

Um die Filterung auf Anwendungs- und Systemprotokollebene für Ihre Funktion zu konfigurieren, können Sie die Lambda-Konsole oder die AWS Command Line Interface (AWS CLI) verwenden. Sie können die Protokollebene einer Funktion auch mithilfe der UpdateFunctionConfiguration Lambda-API-Befehle CreateFunction und , der AWS Serverless Application Model (AWS SAM)-AWS::Serverless::FunctionRessource und der -AWS CloudFormationAWS::Lambda::FunctionRessource konfigurieren.

Beachten Sie, dass, wenn Sie die Protokollebene Ihrer Funktion in Ihrem Code festlegen, diese Einstellung Vorrang vor allen anderen von Ihnen konfigurierten Einstellungen auf Protokollebene hat. Wenn Sie beispielsweise die Python-Methode logging setLevel() verwenden, um die Protokollierungsebene Ihrer Funktion auf INFO zu setzen, hat diese Einstellung Vorrang vor der Einstellung WARN, die Sie mit der Lambda-Konsole konfigurieren.

So konfigurieren Sie die Anwendungs- oder Systemprotokollebene (Konsole) einer vorhandenen Funktion
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie eine Funktion aus.

  3. Wählen Sie auf der Konfigurationsseite der Funktion die Option Überwachungs- und Betriebstools aus.

  4. Wählen Sie im Bereich Protokollierungskonfiguration die Option Bearbeiten aus.

  5. Stellen Sie sicher, dass unter Protokollinhalt für Protokollformat JSON ausgewählt ist.

  6. Wählen Sie mit den Optionsfeldern die gewünschte Anwendungsprotokollebene und die gewünschte Systemprotokollebene für Ihre Funktion aus.

  7. Wählen Sie Speichern.

So konfigurieren Sie die Anwendungs- oder Systemprotokollebene einer vorhandenen Funktion (AWS CLI)
  • Verwenden Sie den Befehl update-function-configuration, um die Anwendungs- oder Systemprotokollebene einer vorhandenen Funktion zu ändern. Legen Sie --system-log-level auf DEBUG, INFO oder WARN fest. Legen Sie --application-log-level auf DEBUG, INFO, WARN, ERROR oder FATAL fest.

    aws lambda update-function-configuration \ --function-name myFunction --system-log-level WARN \ --application-log-level ERROR
So konfigurieren Sie die Filterung auf Protokollebene beim Erstellen einer Funktion
  • Um die Filterung auf Protokollebene zu konfigurieren, wenn Sie eine neue Funktion erstellen, verwenden Sie die Optionen --system-log-level und --application-log-level im Befehl „create-function“. Legen Sie --system-log-level auf DEBUG, INFO oder WARN fest. Legen Sie --application-log-level auf DEBUG, INFO, WARN, WARN oder FATAL fest.

    aws lambda create-function --function-name myFunction --runtime nodejs18.x \ --handler index.handler --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole --system-log-level WARN \ --application-log-level ERROR

Zuordnung von Ereignissen auf Systemprotokollebene

Für von Lambda generierte Protokollereignisse auf Systemebene ist in der folgenden Tabelle die Protokollebene definiert, die jedem Ereignis zugewiesen ist. Weitere Informationen zu den in der Tabelle aufgeführten Ereignissen finden Sie unter Referenz zum Event-Schema der Lambda-Telemetrie-API

Ereignisname Bedingung Zugewiesene Protokollebene
initStart „runtimeVersion“ ist festgelegt INFO
initStart „runtimeVersion“ ist nicht festgelegt DEBUG
initRuntimeDone status=success DEBUG
initRuntimeDone status!=success WARN
initReport initializationType=snapstart INFO
initReport initializationType!=snapstart DEBUG
initReport status!=success WARN
restoreStart „runtimeVersion“ ist festgelegt INFO
restoreStart „runtimeVersion“ ist nicht festgelegt DEBUG
restoreRuntimeDone status=success DEBUG
restoreRuntimeDone status!=success WARN
restoreReport status=success INFO
restoreReport status!=success WARN
start - INFO
runtimeDone status=success DEBUG
runtimeDone status!=success WARN
report status=success INFO
report status!=success WARN
extension state=success INFO
extension state!=success WARN
logSubscription - INFO
telemetrySubscription - INFO
logsDropped - WARN
Anmerkung

Die Lambda-Telemetrie-API gibt immer den vollständigen Satz von Plattformereignissen aus. Die Konfiguration der Ebene der Systemprotokolle, die Lambda an sendet, CloudWatch wirkt sich nicht auf das Verhalten der Lambda-Telemetrie-API aus.

Filterung auf Anwendungsprotokollebene mit benutzerdefinierten Laufzeiten

Wenn Sie die Filterung auf Anwendungsprotokollebene für Ihre Funktion konfigurieren, legt Lambda hinter den Kulissen die Anwendungsprotokollebene in der Laufzeit mithilfe der Umgebungsvariable AWS_LAMBDA_LOG_LEVEL fest. Lambda legt auch das Protokollformat Ihrer Funktion mithilfe der Umgebungsvariable AWS_LAMBDA_LOG_FORMAT fest. Sie können diese Variablen verwenden, um erweiterte Lambda-Protokollierungsoptionen in eine benutzerdefinierte Laufzeit zu integrieren.

Um Protokollierungseinstellungen für eine Funktion konfigurieren zu können, die eine benutzerdefinierte Laufzeit mit der Lambda-Konsole, AWS CLI und Lambda-APIs verwendet, konfigurieren Sie Ihre benutzerdefinierte Laufzeit so, dass sie den Wert dieser Umgebungsvariablen überprüft. Anschließend können Sie die Logger Ihrer Laufzeit gemäß dem von Ihnen ausgewählten Protokollformat und den von Ihnen ausgewählten Protokollebenen konfigurieren.

Konfigurieren von CloudWatch Protokollgruppen

Standardmäßig erstellt CloudWatch automatisch eine Protokollgruppe mit dem Namen /aws/lambda/<function name> für Ihre Funktion, wenn sie zum ersten Mal aufgerufen wird. Um Ihre Funktion so zu konfigurieren, dass Protokolle an eine bestehende Protokollgruppe gesendet werden, oder um eine neue Protokollgruppe für Ihre Funktion zu erstellen, können Sie die Lambda-Konsole oder die AWS CLI verwenden. Sie können benutzerdefinierte Protokollgruppen auch mithilfe der UpdateFunctionConfiguration Lambda-API-Befehle CreateFunction und und der Ressource AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function konfigurieren.

Sie können mehrere Lambda-Funktionen so konfigurieren, dass Protokolle an dieselbe CloudWatch Protokollgruppe gesendet werden. Beispielsweise könnten Sie eine einzelne Protokollgruppe verwenden, um Protokolle für alle Lambda-Funktionen zu speichern, aus denen eine bestimmte Anwendung besteht. Wenn Sie eine benutzerdefinierte Protokollgruppe für eine Lambda-Funktion verwenden, enthalten die von Lambda erstellten Protokollstreams den Funktionsnamen und die Funktionsversion. Dadurch wird sichergestellt, dass die Zuordnung zwischen Protokollmeldungen und Funktionen erhalten bleibt, auch wenn Sie dieselbe Protokollgruppe für mehrere Funktionen verwenden.

Das Benennungsformat des Protokollstreams für benutzerdefinierte Protokollgruppen folgt dieser Konvention:

YYYY/MM/DD/<function_name>[<function_version>][<execution_environment_GUID>]

Beachten Sie, dass bei der Konfiguration einer benutzerdefinierten Protokollgruppe der Name, den Sie für Ihre Protokollgruppe auswählen, den CloudWatch Regeln für die Benennung von Protokollen entsprechen muss. Darüber hinaus dürfen benutzerdefinierte Protokollgruppennamen nicht mit der Zeichenfolge aws/ beginnen. Wenn Sie eine benutzerdefinierte Protokollgruppe erstellen, die mit aws/ beginnt, kann Lambda die Protokollgruppe nicht erstellen. Daher werden die Protokolle Ihrer Funktion nicht an gesendet CloudWatch.

So ändern Sie die Protokollgruppe einer Funktion (Konsole)
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie eine Funktion aus.

  3. Wählen Sie auf der Konfigurationsseite der Funktion die Option Überwachungs- und Betriebstools aus.

  4. Wählen Sie im Bereich Protokollierungskonfiguration die Option Bearbeiten aus.

  5. Wählen Sie im Bereich Protokollgruppe für CloudWatch Protokollgruppe die Option Benutzerdefiniert aus.

  6. Geben Sie unter Benutzerdefinierte Protokollgruppe den Namen der CloudWatch Protokollgruppe ein, an die Ihre Funktion Protokolle senden soll. Wenn Sie den Namen einer vorhandenen Protokollgruppe eingeben, verwendet Ihre Funktion diese Gruppe. Wenn keine Protokollgruppe mit dem von Ihnen eingegebenen Namen existiert, erstellt Lambda eine neue Protokollgruppe für Ihre Funktion mit diesem Namen.

So ändern Sie die Protokollgruppe einer Funktion (AWS CLI)
  • Verwenden Sie den Befehl update-function-configuration, um die Protokollgruppe einer vorhandenen Funktion zu ändern. Wenn Sie den Namen einer vorhandenen Protokollgruppe angeben, verwendet Ihre Funktion diese Gruppe. Wenn keine Protokollgruppe mit dem von Ihnen angegebenen Namen existiert, erstellt Lambda eine neue Protokollgruppe für Ihre Funktion mit diesem Namen.

    aws lambda update-function-configuration \ --function-name myFunction --log-group myLogGroup
So geben Sie eine benutzerdefinierte Protokollgruppe an, wenn Sie eine Funktion erstellen (AWS CLI)
  • Um eine benutzerdefinierte Protokollgruppe anzugeben, wenn Sie eine neue Lambda-Funktion mit derAWS CLI erstellen, verwenden Sie die Option --log-group. Wenn Sie den Namen einer vorhandenen Protokollgruppe angeben, verwendet Ihre Funktion diese Gruppe. Wenn keine Protokollgruppe mit dem von Ihnen angegebenen Namen existiert, erstellt Lambda eine neue Protokollgruppe für Ihre Funktion mit diesem Namen.

    Mit dem folgenden Beispielbefehl wird eine Node.js-Lambda-Funktion erstellt, die Protokolle an eine Protokollgruppe mit dem Namen myLogGroup sendet.

    aws lambda create-function --function-name myFunction --runtime nodejs18.x \ --handler index.handler --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole --log-group myLogGroup

Berechtigungen für die Ausführungsrolle

Damit Ihre Funktion Protokolle an CloudWatch -Protokolle senden kann, muss sie über die -logs:PutLogEventsBerechtigung verfügen. Wenn Sie die Protokollgruppe Ihrer Funktion mithilfe der Lambda-Konsole konfigurieren und Ihre Funktion diese Berechtigung nicht besitzt, fügt Lambda sie standardmäßig der Ausführungsrolle der Funktion hinzu. Wenn Lambda diese Berechtigung hinzufügt, erteilt es der Funktion die Berechtigung, Protokolle an jede CloudWatch Protokollgruppe zu senden.

Um zu verhindern, dass Lambda die Ausführungsrolle der Funktion automatisch aktualisiert, damit Sie diese stattdessen manuell bearbeiten, erweitern Sie Berechtigungen und deaktivieren Sie Erforderliche Berechtigungen hinzufügen.

Wenn Sie die Protokollgruppe Ihrer Funktion mithilfe der AWS CLI konfigurieren, fügt Lambda die logs:PutLogEvents-Berechtigung nicht automatisch hinzu. Fügen Sie die Berechtigung zur Ausführungsrolle Ihrer Funktion hinzu, falls noch nicht geschehen. Diese Berechtigung ist in der von AWSLambdaBasicExecutionRole verwalteten Richtlinie enthalten.

Zugreifen auf Protokolle mit der Lambda-Konsole

Die Protokolle mithilfe der Lambda-Konsole anzeigen
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie eine Funktion aus.

  3. Wählen Sie Überwachen aus.

  4. Wählen Sie Protokolle anzeigen in CloudWatch.

Zugriff auf Protokolle mit der AWS CLI

Die AWS CLI ist ein Open-Source-Tool, mit dem Sie über Befehle in Ihrer Befehlszeilen-Shell mit den AWS-Services interagieren können. Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:

Sie können die AWS CLI verwenden, um Protokolle für einen Aufruf mit der --log-type-Befehlsoption abzurufen. Die Antwort enthält das Feld LogResult, das bis zu 4 KB base64-verschlüsselte Protokolle aus dem Aufruf enthält.

Beispiel eine Log-ID abrufen

Das folgende Beispiel zeigt, wie eine Protokoll-ID aus dem LogResult-Feld für eine Funktion namens my-function abgerufen wird.

aws lambda invoke --function-name my-function out --log-type Tail

Die Ausgabe sollte folgendermaßen aussehen:

{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
Beispiel entschlüsseln der Protokolle

Verwenden Sie in derselben Eingabeaufforderung das base64-Dienstprogramm, um die Protokolle zu entschlüsseln. Das folgende Beispiel zeigt, wie Base64-codierte Logs für abgerufen werde my-function.

aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode

Die cli-binary-format-Option ist erforderlich, wenn Sie AWS CLI Version 2 verwenden. Um dies zur Standardeinstellung zu machen, führen Sie aws configure set cli-binary-format raw-in-base64-out aus. Weitere Informationen finden Sie unter Von AWS CLI unterstützte globale Befehlszeilenoptionen im AWS Command Line Interface-Benutzerhandbuch für Version 2.

Die Ausgabe sollte folgendermaßen aussehen:

START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib", END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Duration: 79.67 ms Billed Duration: 80 ms Memory Size: 128 MB Max Memory Used: 73 MB

Das base64-Dienstprogramm ist unter Linux, macOS und Ubuntu auf Windowsverfügbar. macOS-Benutzer müssen möglicherweise base64 -D verwenden.

Beispiel get-logs.sh-Skript

Verwenden Sie in derselben Eingabeaufforderung das folgende Skript, um die letzten fünf Protokollereignisse herunterzuladen. Das Skript verwendet sed zum Entfernen von Anführungszeichen aus der Ausgabedatei und wechselt 15 Sekunden lang in den Ruhezustand, um Zeit einzuräumen, damit Protokolle verfügbar werden können. Die Ausgabe enthält die Antwort von Lambda und die get-log-eventsAusgabe des Befehls.

Kopieren Sie den Inhalt des folgenden Codebeispiels und speichern Sie es in Ihrem Lambda-Projektverzeichnis unter get-logs.sh.

Die cli-binary-format-Option ist erforderlich, wenn Sie AWS CLI Version 2 verwenden. Um dies zur Standardeinstellung zu machen, führen Sie aws configure set cli-binary-format raw-in-base64-out aus. Weitere Informationen finden Sie unter Von AWS CLI unterstützte globale Befehlszeilenoptionen im AWS Command Line Interface-Benutzerhandbuch für Version 2.

#!/bin/bash aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out sed -i'' -e 's/"//g' out sleep 15 aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name stream1 --limit 5
Beispiel macOS und Linux (nur diese Systeme)

In derselben Eingabeaufforderung müssen macOS- und Linux-Benutzer möglicherweise den folgenden Befehl ausführen, um sicherzustellen, dass das Skript ausführbar ist.

chmod -R 755 get-logs.sh
Beispiel die letzten fünf Protokollereignisse abrufen

Führen Sie an derselben Eingabeaufforderung das folgende Skript aus, um die letzten fünf Protokollereignisse abzurufen.

./get-logs.sh

Die Ausgabe sollte folgendermaßen aussehen:

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" } { "events": [ { "timestamp": 1559763003171, "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n", "ingestionTime": 1559763003309 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r \"key\": \"value\"\r}\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n", "ingestionTime": 1559763018353 } ], "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795", "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080" }

Protokollierung von Laufzeitfunktionen

Um zu debuggen und zu validieren, dass Ihr Code wie erwartet funktioniert, können Sie Protokolle mit der Standardprotokollfunktionalität für Ihre Programmiersprache ausgeben. Die Lambda-Laufzeit lädt die Protokollausgabe Ihrer Funktion in CloudWatch Protokolle hoch. Sprachenspezifische Anweisungen finden Sie in den folgenden Themen:

Als nächstes