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 überwacht automatisch Lambda-Funktionen und sendet Protokolleinträge an Amazon CloudWatch. Ihre Lambda-Funktion enthält eine CloudWatch Logs-Log-Gruppe und einen Log-Stream für jede Instanz 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 Logs finden Sie unter CloudWatch Logs mit Lambda verwenden.
Um Protokolle aus Ihrem Funktionscode auszugeben, können Sie Methoden von java.lang.System
Sections
Verwenden von Lambda-Optionen für die erweiterte Protokollierung mit Java
Implementierung der erweiterten Protokollierung mit Log4J2 und J SLF4
Andere Tools und Bibliotheken für die Protokollierung verwenden
Verwendung von Powertools für AWS Lambda (Java) und für strukturiertes Logging AWS SAM
Logs mit dem Befehl () anzeigen AWS Command Line InterfaceAWS CLI
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-coreBibliothek stellt eine Logger-Klasse mit dem Namen bereit, auf LambdaLogger
die Sie vom Kontextobjekt aus 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. Wenn Aufrufe eine Ausführungsumgebung gemeinsam nutzen, meldet Lambda den maximalen Speicherverbrauch für alle Aufrufe. Dieses Verhalten kann zu einem höheren als erwarteten gemeldeten Wert führen.
-
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 — Für verfolgte Anfragen die AWS X-Ray Trace-ID.
-
SegmentId— Für verfolgte Anfragen 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 — für Logs im JSON-Format wählen Sie die Detailebene der Logs, an die Lambda sendet CloudWatch, wie ERROR, DEBUG oder INFO
-
Protokollgruppe — wählen Sie die CloudWatch Protokollgruppe aus, an die Ihre Funktion Logs sendet
Weitere Informationen zu diesen Protokollierungsoptionen und Anweisungen zur Konfiguration Ihrer Funktion für deren Verwendung finden Sie unter Konfigurieren erweiterter Protokollierungsoptionen für Lambda-Funktionen.
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 mit diesem Beispielcode würde wie folgt in CloudWatch Logs 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 so konfigurieren, dass sie das JSON-Protokollformat verwendet, erscheinen Ihre Logging-Ausgaben CloudWatch in der von Ihnen definierten JSON-Struktur.
Verwenden der Filterung auf Protokollebene mit Java
AWS Lambda Um Ihre Anwendungsprotokolle nach ihrer Protokollebene zu filtern, muss Ihre Funktion Protokolle im JSON-Format 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 Lambda-Funktionen. -
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 for AWS Lambda oder das Paket Log4J2 verwenden, um strukturierte JSON-Protokollausgaben aus Ihrem Code zu generieren. Weitere Informationen dazu finden Sie unter Verwendung von Powertools für AWS Lambda (Java) und für strukturiertes Logging AWS SAM und Implementierung der erweiterten Protokollierung mit Log4J2 und J SLF4.
Wenn Sie Ihre Funktion so konfigurieren, dass sie Filterung auf Protokollebene verwendet, müssen Sie aus den folgenden Optionen für die Protokollebene auswählen, die Lambda an Logs senden soll: CloudWatch
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 Stufe und niedriger bis CloudWatch. Wenn Sie beispielsweise die Protokollebene WARN konfigurieren, sendet Lambda Protokolle, die den Stufen WARN, ERROR und FATAL entsprechen.
Implementierung der erweiterten Protokollierung mit Log4J2 und J SLF4
Anmerkung
AWS Lambda nimmt Log4j2 nicht in seine verwalteten Laufzeiten oder Basis-Container-Images auf. 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 Kunden, die die aws-lambda-java-log 4j2-Bibliothek in ihren Funktionen verwenden, sollten 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-log 4j2-Binärdatei ist im Maven-Repository verfügbar und der Quellcode
Beachten Sie abschließend, dass 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.
Um die Protokollausgabe anzupassen, die Protokollierung bei Komponententests zu unterstützen und AWS SDK-Aufrufe zu protokollieren, verwenden Sie Apache Log4j2 mit SLF4 J. Log4j ist eine Logging-Bibliothek für Java-Programme, mit der Sie Protokollebenen 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.
Verwenden Sie den Appender in der aws-lambda-java-log4j2-Bibliothek, um die Anforderungs-ID zu den Protokollen Ihrer Funktion hinzuzufügen.
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 Einloggen in Java-Code. In Ihrem Funktionscode verwenden Sie die SLF4 J Logger Factory, um einen Logger mit Methoden für Log-Levels wie info()
und abzurufenwarn()
. In Ihrer Build-Konfiguration nehmen Sie die Logging-Bibliothek und den SLF4 J-Adapter in den Klassenpfad auf. Indem Sie die Bibliotheken in der Build-Konfiguration ändern, können Sie den Logger-Typ ändern, ohne Ihren Funktionscode zu ändern. SLF4J ist erforderlich, um Protokolle aus dem SDK for Java zu erfassen.
Im folgenden Beispielcode verwendet die Handler-Klasse SLF4 J, um einen Logger abzurufen.
Beispiel src/main/java/example/HandlerS3.java — Protokollierung mit SLF4 J
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 verwendet Laufzeitabhängigkeiten vom Lambda-Appender und SLF4 J-Adapter sowie Implementierungsabhängigkeiten von Log4j2.
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 für die Protokollierung verwenden
Powertools for 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
Verwendung von Powertools für AWS Lambda (Java) und für strukturiertes Logging AWS SAM
Gehen Sie wie folgt vor, um eine Hello World Java-Beispielanwendung mit integrierten Powertools for AWS Lambda (Java) ~-Modulenhello 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 eine ältere Version der AWS SAM CLI haben, finden Sie weitere Informationen unter Upgrade der AWS SAM CLI.
Stellen Sie eine AWS SAM Beispielanwendung bereit
-
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 ist HelloWorldFunction möglicherweise keine Autorisierung definiert. Ist das in Ordnung? , stellen Sie sicher, dass Sie eintreten
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 zu vermeiden, dass Protokolle auf unbestimmte Zeit gespeichert werden, löschen Sie die Protokollgruppe oder konfigurieren Sie einen Aufbewahrungszeitraum, nach dessen Ablauf die Protokolle CloudWatch automatisch gelöscht werden. Um die Aufbewahrung von Protokollen 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
Anzeigen von Protokollen in der 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.
Protokolle in der CloudWatch Konsole anzeigen
Sie können die CloudWatch Amazon-Konsole verwenden, um Protokolle für alle Lambda-Funktionsaufrufe anzuzeigen.
Um Protokolle auf der Konsole anzuzeigen CloudWatch
-
Öffnen Sie die Seite Protokollgruppen
auf der CloudWatch Konsole. -
Wählen Sie die Protokollgruppe für Ihre Funktion (
your-function-name
/aws/lambda/). -
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 Logs 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.
Logs mit dem Befehl () anzeigen AWS Command Line InterfaceAWS CLI
Das AWS CLI ist ein Open-Source-Tool, mit dem Sie mithilfe von Befehlen in Ihrer Befehlszeilen-Shell mit AWS Diensten interagieren können. Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie AWS CLI Version 2.
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 die einfache Bereitstellung und Bereinigung, eine AWS SAM Vorlage und unterstützende Ressourcen.
Lambda-Beispielanwendungen in Java
-
example-java
— Eine Java-Funktion, die demonstriert, wie Sie Lambda zur Bearbeitung von Bestellungen verwenden können. Diese Funktion veranschaulicht, wie Sie ein benutzerdefiniertes Eingabeereignisobjekt definieren und deserialisieren, das SDK verwenden und wie Sie die AWS Ausgabe protokollieren. -
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-eventsBibliothek (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. -
layer-java
— Eine Java-Funktion, die veranschaulicht, wie Sie eine Lambda-Schicht verwenden, um Abhängigkeiten getrennt von Ihrem Kernfunktionscode zu verpacken.
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. Aus Gründen der Kompatibilität mit dem SDK wird SLF4 J als Fassade verwendet. AWS Protokollbibliotheken werden von der Build-Ausgabe ausgeschlossen, um das Bereitstellungspaket klein zu halten.