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.
AWS Lambda -Funktionsprotokollierung in Java
AWS Lambda überwacht automatisch Lambda-Funktionen und sendet Protokolleinträge an Amazon CloudWatch. Ihre Lambda-Funktion verfügt über eine CloudWatch Protokollgruppe und einen Protokollstream für jede Instance Ihrer Funktion. Die Lambda-Laufzeitumgebung sendet Details zu den einzelnen Aufrufen an den Protokollstream und leitet Protokolle und andere Ausgaben aus dem Code Ihrer Funktion weiter. Weitere Informationen zu - CloudWatch Protokollen finden Sie unter Verwenden von Amazon CloudWatch -Protokollen mit AWS Lambda.
Um Protokolle aus Ihrem Funktionscode auszugeben, können Sie Methoden von java.lang.System
Sections
- Erstellen einer Funktion, die Protokolle zurückgibt
- Verwenden von Lambda-Optionen für die erweiterte Protokollierung mit Java
- Erweiterte Protokollierung mit Log4j2 und SLF4J
- Andere Tools und Bibliotheken
- Verwenden von Powertools für AWS Lambda (Java) und AWS SAM für strukturierte Protokollierung
- Verwenden von Lambda-Konsole
- Verwenden der CloudWatch Konsole
- Verwenden der AWS Command Line Interface (AWS CLI)
- Löschen von Protokollen
- Beispielprotokolliercode
Erstellen einer Funktion, die Protokolle zurückgibt
Um Protokolle aus dem Code Ihrer Funktion auszugeben, können Sie Methoden für java.lang.System stdout
oder stderr
schreibt. Die aws-lambda-java-core Bibliothek stellt eine Logger-Klasse mit dem Namen bereitLambdaLogger
, auf die Sie über das Kontextobjekt zugreifen können. Die Logger-Klasse unterstützt mehrzeilige Protokolle.
Im folgenden Beispiel wird der LambdaLogger
-Logger verwendet, der vom Kontextobjekt bereitgestellt wird.
Beispiel handler.java
// Handler value: example.Handler public class Handler implements RequestHandler<Object, String>{ Gson gson = new GsonBuilder().setPrettyPrinting().create(); @Override public String handleRequest(Object event, Context context) {
LambdaLogger logger = context.getLogger();
String response = new String("SUCCESS"); // log execution detailslogger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv())); logger.log("CONTEXT: " + gson.toJson(context));
// process eventlogger.log("EVENT: " + gson.toJson(event));
return response; } }
Beispiel Protokollformat
START RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0 Version: $LATEST ENVIRONMENT VARIABLES: { "_HANDLER": "example.Handler", "AWS_EXECUTION_ENV": "AWS_Lambda_java8", "AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "512", ... } CONTEXT: { "memoryLimit": 512, "awsRequestId": "6bc28136-xmpl-4365-b021-0ce6b2e64ab0", "functionName": "java-console", ... } EVENT: { "records": [ { "messageId": "19dd0b57-xmpl-4ac1-bd88-01bbb068cb78", "receiptHandle": "MessageReceiptHandle", "body": "Hello from SQS!", ... } ] } END RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0 REPORT RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0 Duration: 198.50 ms Billed Duration: 200 ms Memory Size: 512 MB Max Memory Used: 90 MB Init Duration: 524.75 ms
Die Java-Laufzeit protokolliert die Zeilen START
, END
und REPORT
für jeden Aufruf. Die Berichtszeile enthält die folgenden Details:
Datenfelder für REPORT-Zeilen
-
RequestId – Die eindeutige Anforderungs-ID für den Aufruf.
-
Dauer – Die Zeit, die die Handler-Methode Ihrer Funktion mit der Verarbeitung des Ereignisses verbracht hat.
-
Fakturierte Dauer – Die für den Aufruf fakturierte Zeit.
-
Speichergröße – Die der Funktion zugewiesene Speichermenge.
-
Max. verwendeter Speicher – Die Speichermenge, die von der Funktion verwendet wird.
-
Initialisierungsdauer – Für die erste Anfrage die Zeit, die zur Laufzeit zum Laden der Funktion und Ausführen von Code außerhalb der Handler-Methode benötigt wurde.
-
XRAY TraceId – Bei verfolgten Anforderungen die AWS X-Ray Ablaufverfolgungs-ID .
-
SegmentId – Bei verfolgten Anforderungen die X-Ray-Segment-ID.
-
Stichprobe – Bei verfolgten Anforderungen das Stichprobenergebnis.
Verwenden von Lambda-Optionen für die erweiterte Protokollierung mit Java
Um Ihnen mehr Kontrolle darüber zu geben, wie die Protokolle Ihrer Funktionen erfasst, verarbeitet und verwendet werden, können Sie die folgenden Protokollierungsoptionen für unterstützte Java-Laufzeiten konfigurieren:
-
Protokollformat – Wählen Sie zwischen Klartext und einem strukturierten JSON-Format für die Protokolle Ihrer Funktion aus.
-
Protokollebene – Wählen Sie für Protokolle im JSON-Format 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
Weitere Informationen zu diesen Protokollierungsoptionen und Anweisungen zur Konfiguration Ihrer Funktion für deren Verwendung finden Sie unter Konfigurieren erweiterter Protokollierungsoptionen für die Lambda-Funktion.
Informationen zur Verwendung der Optionen für das Protokollformat und die Protokollebene mit Ihren Java-Lambda-Funktionen finden Sie in den folgenden Abschnitten.
Verwenden des strukturierten JSON-Protokollformats mit Java
Wenn Sie JSON für das Protokollformat Ihrer Funktion auswählen, sendet Lambda die Protokollausgabe unter Verwendung der LambdaLogger
-Klasse als strukturiertes JSON. Jedes JSON-Protokollobjekt enthält mindestens vier Schlüssel-Wert-Paare mit den folgenden Schlüsseln:
-
"timestamp"
– die Uhrzeit, zu der die Protokollmeldung generiert wurde -
"level"
– die der Meldung zugewiesene Protokollebene -
"message"
– der Inhalt der Protokollmeldung -
"AWSrequestId"
– die eindeutige Anforderungs-ID für den Funktionsaufruf
Abhängig von der verwendeten Protokollierungsmethode können die im JSON-Format erfassten Protokollausgaben Ihrer Funktion auch zusätzliche Schlüssel-Wert-Paare enthalten.
Um Protokollen, die Sie mit dem LambdaLogger
-Logger erstellen, eine Ebene zuzuweisen, müssen Sie in Ihrem Protokollierungsbefehl ein LogLevel
-Argument angeben, wie im folgenden Beispiel gezeigt.
Beispiel Protokollierungscode für Java
LambdaLogger logger = context.getLogger(); logger.log("This is a debug log", LogLevel.DEBUG);
Diese Protokollausgabe nach diesem Beispielcode würde wie folgt in - CloudWatch Protokollen erfasst werden:
Beispiel JSON-Protokolldatensatz
{
"timestamp":"2023-11-01T00:21:51.358Z",
"level":"DEBUG",
"message":"This is a debug log",
"AWSrequestId":"93f25699-2cbf-4976-8f94-336a0aa98c6f"
}
Wenn Sie Ihrer Protokollausgabe keine Ebene zuweisen, weist Lambda ihr automatisch die Ebene INFO zu.
Wenn Ihr Code bereits eine andere Protokollierungsbibliothek verwendet, um strukturierte JSON-Protokolle zu erstellen, müssen Sie keine Änderungen vornehmen. Lambda codiert Protokolle, die bereits JSON-codiert sind, nicht doppelt. Selbst wenn Sie Ihre Funktion für die Verwendung des JSON-Protokollformats konfigurieren, werden Ihre Protokollierungsausgaben in CloudWatch in der von Ihnen definierten JSON-Struktur angezeigt.
Verwenden der Filterung auf Protokollebene mit Java
Damit Ihre Anwendungsprotokolle nach ihrer Protokollebene AWS Lambda filtern kann, muss Ihre Funktion JSON-formatierte Protokolle verwenden. Sie können dies auf zwei Arten erreichen:
-
Erstellen Sie Protokollausgaben mithilfe der Standard-
LambdaLogger
und konfigurieren Sie Ihre Funktion so, dass sie die JSON-Protokollformatierung verwendet. Lambda filtert dann Ihre Protokollausgaben mithilfe des Schlüssel-Wert-Paars „level“ im JSON-Objekt, wie unter Verwenden des strukturierten JSON-Protokollformats mit Java beschrieben. Informationen zur Konfiguration des Protokollformats Ihrer Funktion finden Sie unter Konfigurieren erweiterter Protokollierungsoptionen für die Lambda-Funktion. -
Verwenden Sie eine andere Protokollierungsbibliothek oder Methode, um strukturierte JSON-Protokolle in Ihrem Code zu erstellen, die ein „level“-Schlüssel-Wert-Paar enthalten, das die Ebene der Protokollausgabe definiert. Sie können auch eine beliebige Protokollierungsbibliothek verwenden, die JSON-Protokolle in
stdout
oderstderr
schreibt. Sie können beispielsweise Powertools für AWS Lambda oder das Log4j2-Paket verwenden, um strukturierte JSON-Protokollausgaben aus Ihrem Code zu generieren. Weitere Informationen dazu finden Sie unter Verwenden von Powertools für AWS Lambda (Java) und AWS SAM für strukturierte Protokollierung und Erweiterte Protokollierung mit Log4j2 und SLF4J.
Wenn Sie Ihre Funktion für die Verwendung der Filterung auf Protokollebene konfigurieren, müssen Sie eine der folgenden Optionen für die Protokollebene auswählen, die Lambda an CloudWatch Protokolle senden soll:
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 |
Damit Lambda die Protokolle Ihrer Funktion filtern kann, müssen Sie auch ein "timestamp"
-Schlüssel-Wert-Paar in Ihre JSON-Protokollausgabe aufnehmen. Die Uhrzeit muss im gültigen RFC 3339
Lambda sendet Protokolle der ausgewählten Ebene und niedriger an CloudWatch. Wenn Sie beispielsweise die Protokollebene WARN konfigurieren, sendet Lambda Protokolle, die den Stufen WARN, ERROR und FATAL entsprechen.
Erweiterte Protokollierung mit Log4j2 und SLF4J
Anmerkung
AWS Lambda schließt Log4j2 nicht in seine verwalteten Laufzeiten oder Basis-Container-Images ein. Diese sind daher von den in CVE-2021-44228, CVE-2021-45046 und CVE-2021-45105 beschriebenen Problemen nicht betroffen.
Für Fälle, in denen eine Kundenfunktion eine betroffene Log4j2-Version enthält, haben wir eine Änderung an den verwalteten Lambda-Java-Laufzeiten und Basis-Container-Images vorgenommen, die dazu beiträgt, die Probleme in CVE-2021-44228, CVE-2021-45046 und CVE-2021-45105 zu entschärfen. Infolge dieser Änderung sehen Kunden, die Log4J2 verwenden, möglicherweise einen zusätzlichen Protokolleintrag ähnlich wie „Transforming org/apache/logging/log4j/core/lookup/JndiLookup (java.net.URLClassLoader@...)
“. Alle Log-Strings, die in der Log4J2-Ausgabe auf den jndi-Mapper verweisen, werden durch „Patched JndiLookup::lookup()
“ ersetzt.
Unabhängig von dieser Änderung empfehlen wir allen Kunden, deren Funktionen Log4j2 enthalten, nachdrücklich, auf die neueste Version zu aktualisieren. Insbesondere sollten Kunden, die die aws-lambda-java-log4j2-Bibliothek in ihren Funktionen verwenden, auf Version 1.5.0 (oder höher) aktualisieren und ihre Funktionen erneut bereitstellen. Diese Version aktualisiert die zugrunde liegenden Abhängigkeiten des Log4j2-Dienstprogramms auf Version 2.17.0 (oder höher). Die aktualisierte aws-lambda-java-log4j2-Binärdatei ist im Maven-Repository
Beachten Sie abschließend, dass alle Bibliotheken, die sich auf aws-lambda-java-log4j (v1.0.0 oder 1.0.1) beziehen, unter keinen Umständen verwendet werden sollten. Diese Bibliotheken beziehen sich auf Version 1.x von log4j, deren Nutzungsdauer 2015 abgelaufen ist. Die Bibliotheken werden nicht unterstützt, nicht gewartet, nicht gepatcht und haben bekannte Sicherheitslücken.
Verwenden Sie Apache Log4j2 mit SLF4J, um die Protokollausgabe anzupassen, die Protokollierung während Einheitentests zu unterstützen und AWS SDK-Aufrufe zu protokollieren. SLF4J Log4j ist eine Protokollierungsbibliothek für Java-Programme, mit der Sie Protokollstufen konfigurieren und Appender-Bibliotheken verwenden können. SLF4J ist eine Fassadenbibliothek, mit der Sie ändern können, welche Bibliothek Sie verwenden, ohne Ihren Funktionscode zu ändern.
Um die Anforderungs-ID zu den Protokollen Ihrer Funktion hinzuzufügen, verwenden Sie den Appender in der aws-lambda-java-log4j2-Bibliothek.
Beispiel src/main/resources/log4j2.xml -Appender-Konfiguration
<Configuration> <Appenders> <Lambda name="Lambda" format="${env:AWS_LAMBDA_LOG_FORMAT:-TEXT}"> <LambdaTextFormat> <PatternLayout> <pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n </pattern> </PatternLayout> </LambdaTextFormat> <LambdaJSONFormat> <JsonTemplateLayout eventTemplateUri="classpath:LambdaLayout.json" /> </LambdaJSONFormat> </Lambda> </Appenders> <Loggers> <Root level="${env:AWS_LAMBDA_LOG_LEVEL:-INFO}"> <AppenderRef ref="Lambda"/> </Root> <Logger name="software.amazon.awssdk" level="WARN" /> <Logger name="software.amazon.awssdk.request" level="DEBUG" /> </Loggers> </Configuration>
Sie können entscheiden, wie Ihre Log4j2-Protokolle entweder für Klartext- oder JSON-Ausgaben konfiguriert werden sollen, indem Sie unter den Tags <LambdaTextFormat>
und <LambdaJSONFormat>
ein Layout angeben.
In diesem Beispiel wird im Textmodus jeder Zeile das Datum, die Uhrzeit, die Anforderungs-ID, die Protokollstufe und der Klassenname vorangestellt. Im JSON-Modus wird das <JsonTemplateLayout>
mit einer Konfiguration verwendet, die zusammen mit der aws-lambda-java-log4j2
-Bibliothek geliefert wird.
SLF4J ist eine Fassadenbibliothek zum Protokollieren in Java-Code. In Ihrem Funktionscode verwenden Sie die SLF4J-Logger-Factory, um einen Logger mit Methoden für Protokollstufen wie info()
und warn()
abzurufen. Bei Ihrer Build-Konfiguration schließen Sie die Protokollierungsbibliothek und den SLF4J-Adapter in den Klassenpfad ein. Durch Ändern der Bibliotheken in der Build-Konfiguration können Sie den Logger-Typ ändern, ohne den Funktionscode zu ändern. SLF4J ist erforderlich, um Protokolle aus SDK for Java zu erfassen.
Im folgenden Beispielcode verwendet die Handler-Klasse SLF4J, um einen Logger abzurufen.
Beispiel src/main/java/example/HandlerS3.java – Protokollierung mit SLF4J
package example; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.S3Event; import static org.apache.logging.log4j.CloseableThreadContext.put; public class HandlerS3 implements RequestHandler<S3Event, String>{ private static final Logger logger = LoggerFactory.getLogger(HandlerS3.class); @Override public String handleRequest(S3Event event, Context context) { for(var record : event.getRecords()) { try (var loggingCtx = put("awsRegion", record.getAwsRegion())) { loggingCtx.put("eventName", record.getEventName()); loggingCtx.put("bucket", record.getS3().getBucket().getName()); loggingCtx.put("key", record.getS3().getObject().getKey()); logger.info("Handling s3 event"); } } return "Ok"; } }
Es wird eine ähnliche Protokollausgabe wie die folgende erstellt:
Beispiel Protokollformat
{ "timestamp": "2023-11-15T16:56:00.815Z", "level": "INFO", "message": "Handling s3 event", "logger": "example.HandlerS3", "AWSRequestId": "0bced576-3936-4e5a-9dcd-db9477b77f97", "awsRegion": "eu-south-1", "bucket": "java-logging-test-input-bucket", "eventName": "ObjectCreated:Put", "key": "test-folder/" }
Die Build-Konfiguration nimmt Laufzeitabhängigkeiten auf dem Lambda-Appender sowie SLF4J-Adapter und Implementierungsabhängigkeiten auf Log4j2 an.
Beispiel build.gradle – Protokollierungsabhängigkeiten
dependencies { ... 'com.amazonaws:aws-lambda-java-log4j2:[1.6.0,)', 'com.amazonaws:aws-lambda-java-events:[3.11.3,)', 'org.apache.logging.log4j:log4j-layout-template-json:[2.17.1,)', 'org.apache.logging.log4j:log4j-slf4j2-impl:[2.19.0,)', ... }
Wenn Sie Ihren Code vor Ort für Tests ausführen, ist das Kontextobjekt mit dem Lambda-Logger nicht verfügbar, und es gibt keine Anforderungs-ID, die der Lambda-Appender verwenden kann. Beispiele für Testkonfigurationen finden Sie in den Beispielanwendungen im nächsten Abschnitt.
Andere Tools und Bibliotheken
Powertools für AWS Lambda (Java)
Erfassung von Schlüsselfeldern aus dem Lambda-Kontext, Kaltstart und Strukturen der Protokollierungsausgabe als JSON
Protokollieren Sie Ereignisse von Lambda-Aufrufen, wenn Sie dazu aufgefordert werden (standardmäßig deaktiviert)
Alle Protokolle nur für einen bestimmten Prozentsatz der Aufrufe über Protokollstichproben drucken (standardmäßig deaktiviert)
Fügen Sie dem strukturierten Protokoll zu einem beliebigen Zeitpunkt zusätzliche Schlüssel hinzu
Verwenden Sie einen benutzerdefinierten Protokollformatierer (Bring Your Own Formatter), um Protokolle in einer Struktur auszugeben, die mit dem Logging RFC Ihres Unternehmens kompatibel ist
Verwenden von Powertools für AWS Lambda (Java) und AWS SAM für strukturierte Protokollierung
Führen Sie die folgenden Schritte aus, um eine Hello World Java-Beispielanwendung mit integrierten Modulen Powertools für AWS Lambda (Java)~hello world
-Nachricht zurück.
Voraussetzungen
Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:
-
Java 11
-
AWS SAM CLI-Version 1.75 oder höher. Wenn Sie über eine ältere Version der AWS SAM CLI verfügen, finden Sie weitere Informationen unter Aktualisieren der AWS SAM CLI.
Bereitstellen einer AWS SAM Beispielanwendung
-
Initialisieren Sie die Anwendung mit der Hello World Java-Vorlage.
sam init --app-template hello-world-powertools-java --name sam-app --package-type Zip --runtime java11 --no-tracing
-
Entwickeln Sie die App.
cd sam-app && sam build
-
Stellen Sie die Anwendung bereit.
sam deploy --guided
-
Folgen Sie den Anweisungen auf dem Bildschirm. Um die im interaktiven Erlebnis bereitgestellten Standardoptionen zu akzeptieren, drücken Sie
Enter
.Anmerkung
Für HelloWorldFunction ist möglicherweise keine Autorisierung definiert. Ist das in Ordnung?, stellen Sie sicher, dass Sie eingeben
y
. -
Rufen Sie die URL der bereitgestellten Anwendung ab:
aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
-
Rufen Sie den API-Endpunkt auf:
curl -X GET
<URL_FROM_PREVIOUS_STEP>
Wenn der Link erfolgreich ausgeführt wurde, sehen Sie die folgende Antwort:
{"message":"hello world"}
-
Führen Sie sam logs aus, um die Protokolle für die Funktion abzurufen. Weitere Informationen finden Sie unter Arbeiten mit Protokollen im AWS Serverless Application Model -Entwicklerhandbuch.
sam logs --stack-name sam-app
Das Ergebnis sieht folgendermaßen aus:
2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:34.095000 INIT_START Runtime Version: java:11.v15 Runtime Version ARN: arn:aws:lambda:eu-central-1::runtime:0a25e3e7a1cc9ce404bc435eeb2ad358d8fa64338e618d0c224fe509403583ca 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:34.114000 Picked up JAVA_TOOL_OPTIONS: -XX:+TieredCompilation -XX:TieredStopAtLevel=1 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:34.793000 Transforming org/apache/logging/log4j/core/lookup/JndiLookup (lambdainternal.CustomerClassLoader@1a6c5a9e) 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:35.252000 START RequestId: 7fcf1548-d2d4-41cd-a9a8-6ae47c51f765 Version: $LATEST 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:36.531000 { "_aws": { "Timestamp": 1675416276051, "CloudWatchMetrics": [ { "Namespace": "sam-app-powerools-java", "Metrics": [ { "Name": "ColdStart", "Unit": "Count" } ], "Dimensions": [ [ "Service", "FunctionName" ] ] } ] }, "function_request_id": "7fcf1548-d2d4-41cd-a9a8-6ae47c51f765", "traceId": "Root=1-63dcd2d1-25f90b9d1c753a783547f4dd;Parent=e29684c1be352ce4;Sampled=1", "FunctionName": "sam-app-HelloWorldFunction-y9Iu1FLJJBGD", "functionVersion": "$LATEST", "ColdStart": 1.0, "Service": "service_undefined", "logStreamId": "2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81", "executionEnvironment": "AWS_Lambda_java11" } 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:36.974000 Feb 03, 2023 9:24:36 AM com.amazonaws.xray.AWSXRayRecorder <init> 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:36.993000 Feb 03, 2023 9:24:36 AM com.amazonaws.xray.config.DaemonConfiguration <init> 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:36.993000 INFO: Environment variable AWS_XRAY_DAEMON_ADDRESS is set. Emitting to daemon on address XXXX.XXXX.XXXX.XXXX:2000. 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:37.331000 09:24:37.294 [main] INFO helloworld.App - {"version":null,"resource":"/hello","path":"/hello/","httpMethod":"GET","headers":{"Accept":"*/*","CloudFront-Forwarded-Proto":"https","CloudFront-Is-Desktop-Viewer":"true","CloudFront-Is-Mobile-Viewer":"false","CloudFront-Is-SmartTV-Viewer":"false","CloudFront-Is-Tablet-Viewer":"false","CloudFront-Viewer-ASN":"16509","CloudFront-Viewer-Country":"IE","Host":"XXXX.execute-api.eu-central-1.amazonaws.com","User-Agent":"curl/7.86.0","Via":"2.0 f0300a9921a99446a44423d996042050.cloudfront.net (CloudFront)","X-Amz-Cf-Id":"t9W5ByT11HaY33NM8YioKECn_4eMpNsOMPfEVRczD7T1RdhbtiwV1Q==","X-Amzn-Trace-Id":"Root=1-63dcd2d1-25f90b9d1c753a783547f4dd","X-Forwarded-For":"XX.XXX.XXX.XX, XX.XXX.XXX.XX","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},"multiValueHeaders":{"Accept":["*/*"],"CloudFront-Forwarded-Proto":["https"],"CloudFront-Is-Desktop-Viewer":["true"],"CloudFront-Is-Mobile-Viewer":["false"],"CloudFront-Is-SmartTV-Viewer":["false"],"CloudFront-Is-Tablet-Viewer":["false"],"CloudFront-Viewer-ASN":["16509"],"CloudFront-Viewer-Country":["IE"],"Host":["XXXX.execute-api.eu-central-1.amazonaws.com"],"User-Agent":["curl/7.86.0"],"Via":["2.0 f0300a9921a99446a44423d996042050.cloudfront.net (CloudFront)"],"X-Amz-Cf-Id":["t9W5ByT11HaY33NM8YioKECn_4eMpNsOMPfEVRczD7T1RdhbtiwV1Q=="],"X-Amzn-Trace-Id":["Root=1-63dcd2d1-25f90b9d1c753a783547f4dd"],"X-Forwarded-For":["XXX, XXX"],"X-Forwarded-Port":["443"],"X-Forwarded-Proto":["https"]},"queryStringParameters":null,"multiValueQueryStringParameters":null,"pathParameters":null,"stageVariables":null,"requestContext":{"accountId":"XXX","stage":"Prod","resourceId":"at73a1","requestId":"ba09ecd2-acf3-40f6-89af-fad32df67597","operationName":null,"identity":{"cognitoIdentityPoolId":null,"accountId":null,"cognitoIdentityId":null,"caller":null,"apiKey":null,"principalOrgId":null,"sourceIp":"54.240.197.236","cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":null,"userAgent":"curl/7.86.0","user":null,"accessKey":null},"resourcePath":"/hello","httpMethod":"GET","apiId":"XXX","path":"/Prod/hello/","authorizer":null},"body":null,"isBase64Encoded":false} 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:37.351000 09:24:37.351 [main] INFO helloworld.App - Retrieving https://checkip.amazonaws.com 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:39.313000 { "function_request_id": "7fcf1548-d2d4-41cd-a9a8-6ae47c51f765", "traceId": "Root=1-63dcd2d1-25f90b9d1c753a783547f4dd;Parent=e29684c1be352ce4;Sampled=1", "xray_trace_id": "1-63dcd2d1-25f90b9d1c753a783547f4dd", "functionVersion": "$LATEST", "Service": "service_undefined", "logStreamId": "2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81", "executionEnvironment": "AWS_Lambda_java11" } 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:39.371000 END RequestId: 7fcf1548-d2d4-41cd-a9a8-6ae47c51f765 2023/02/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:39.371000 REPORT RequestId: 7fcf1548-d2d4-41cd-a9a8-6ae47c51f765 Duration: 4118.98 ms Billed Duration: 4119 ms Memory Size: 512 MB Max Memory Used: 152 MB Init Duration: 1155.47 ms XRAY TraceId: 1-63dcd2d1-25f90b9d1c753a783547f4dd SegmentId: 3a028fee19b895cb Sampled: true
-
Dies ist ein öffentlicher API-Endpunkt, der über das Internet zugänglich ist. Es wird empfohlen, dass Sie den Endpunkt nach dem Testen löschen.
sam delete
Verwalten der Protokollaufbewahrung
Wenn Sie eine Funktion löschen, werden Protokollgruppen nicht automatisch gelöscht. Um das unbegrenzte Speichern von Protokollen zu vermeiden, löschen Sie die Protokollgruppe oder konfigurieren Sie einen Aufbewahrungszeitraum, nach dem die Protokolle CloudWatch automatisch löscht. Um die Protokollaufbewahrung einzurichten, fügen Sie Ihrer AWS SAM Vorlage Folgendes hinzu:
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: # Omitting other properties LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}" RetentionInDays: 7
Verwenden von Lambda-Konsole
Sie können die Lambda-Konsole verwenden, um die Protokollausgabe nach dem Aufrufen einer Lambda-Funktion anzuzeigen.
Wenn Ihr Code über den eingebetteten Code-Editor getestet werden kann, finden Sie Protokolle in den Ausführungsergebnissen. Wenn Sie das Feature Konsolentest verwenden, um eine Funktion aufzurufen, finden Sie die Protokollausgabe im Abschnitt Details.
Verwenden der CloudWatch Konsole
Sie können die Amazon- CloudWatch Konsole verwenden, um Protokolle für alle Lambda-Funktionsaufrufe anzuzeigen.
So zeigen Sie Protokolle in der CloudWatch Konsole an
-
Öffnen Sie die Seite Protokollgruppen
in der - CloudWatch Konsole. -
Wählen Sie die Protokollgruppe für Ihre Funktion aus (/aws/lambda/
your-function-name
). -
Wählen Sie eine Protokollstream aus.
Jeder Protokoll-Stream entspricht einer Instance Ihrer Funktion. Ein Protokollstream wird angezeigt, wenn Sie Ihre Lambda-Funktion aktualisieren, und wenn zusätzliche Instances zum Umgang mit mehreren gleichzeitigen Aufrufen erstellt werden. Um Protokolle für einen bestimmten Aufruf zu finden, empfehlen wir, Ihre Funktion mit zu instrumentieren AWS X-Ray. X-Ray erfasst Details zu der Anforderung und dem Protokollstream in der Trace.
Für eine Beispielanwendung, die Protokolle und Traces mit X-Ray korreliert, siehe Fehlerverarbeitungs-Beispielanwendung für AWS Lambda.
Verwenden der AWS Command Line Interface (AWS CLI)
AWS CLI ist ein Open-Source-Tool, mit dem Sie mithilfe von Befehlen in Ihrer Befehlszeilen-Shell mit - 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 Windowsbase64 -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-events
Ausgabe 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-namestream1
--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" }
Löschen von Protokollen
Wenn Sie eine Funktion löschen, werden Protokollgruppen nicht automatisch gelöscht. Um das unbegrenzte Speichern von Protokollen zu vermeiden, löschen Sie die Protokollgruppe oder konfigurieren Sie eine Aufbewahrungszeitraum nach dem Protokolle automatisch gelöscht werden.
Beispielprotokolliercode
Das GitHub Repository für dieses Handbuch enthält Beispielanwendungen, die die Verwendung verschiedener Protokollierungskonfigurationen demonstrieren. Jede Beispielanwendung enthält Skripts für eine einfache Bereitstellung und Bereinigung, eine - AWS SAM Vorlage und unterstützende Ressourcen.
Lambda-Beispielanwendungen in Java
-
java17-examples
– Eine Java-Funktion, die demonstriert, wie ein Java-Datensatz verwendet wird, um ein Eingabeereignis-Datenobjekt darzustellen. -
Java-Basis
– Eine Sammlung minimaler Java-Funktionen mit Einheitentests und variabler Protokollierungskonfiguration. -
Java-Ereignisse
– Eine Sammlung von Java-Funktionen, die Grundcode für den Umgang mit Ereignissen aus verschiedenen Services wie Amazon API Gateway, Amazon SQS und Amazon Kinesis enthalten. Diese Funktionen verwenden die neueste Version der aws-lambda-java-events Bibliothek (3.0.0 und neuer). Für diese Beispiele ist das AWS SDK nicht als Abhängigkeit erforderlich. -
s3-java
– Eine Java-Funktion die Benachrichtigungsereignisse aus Amazon S3 verarbeitet und die Java Class Library (JCL) verwendet, um Miniaturansichten aus hochgeladenen Image-Dateien zu erstellen. -
Verwenden von API Gateway zum Aufrufen einer Lambda-Funktion – Eine Java-Funktion, die eine Amazon-DynamoDB-Tabelle durchsucht, die Mitarbeiterinformationen enthält. Anschließend verwendet es Amazon Simple Notification Service, um eine Textnachricht an Mitarbeiter zu senden, die ihr Betriebsjubiläum feiern. In diesem Beispiel wird API Gateway verwendet, um die Funktion aufzurufen.
Die java-basic
-Beispielanwendung zeigt eine minimale Protokollierungskonfiguration, die Protokollierungstests unterstützt. Der Handler-Code verwendet den LambdaLogger
-Logger, der vom Kontextobjekt bereitgestellt wird. Für Tests verwendet die Anwendung eine benutzerdefinierte TestLogger
-Klasse, die die LambdaLogger
-Schnittstelle mit einem Log4j2-Logger implementiert. Es verwendet SLF4J als Kamera für die Kompatibilität mit dem AWS SDK. Protokollbibliotheken werden von der Build-Ausgabe ausgeschlossen, um das Bereitstellungspaket klein zu halten.