Protokollierung mit dem SDK for Java 2.x - AWS SDK for Java 2.x

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.

Protokollierung mit dem SDK for Java 2.x

Die AWS SDK for Java 2.x verwendet SLF4J , eine Abstraktionsebene, die die Verwendung eines von mehreren Protokollierungsystemen zur Laufzeit ermöglicht.

Zu den unterstützten Protokollierungsystemen gehören unter anderem das Java Logging Framework und Apache Log4j 2. In diesem Thema erfahren Sie, wie Sie Log4j 2 als Protokollierungssystem für die Arbeit mit dem SDK verwenden.

Log4j 2-Konfigurationsdatei

In der Regel verwenden Sie eine Konfigurationsdatei mit dem Namenlog4j2.xml Log4j 2. Beispiel-Konfigurationsdateien werden nachfolgend angezeigt. Weitere Informationen über die Werte in der Konfigurationsdatei finden Sie im Handbuch für die Log4j-Konfiguration.

Die log4j2.xml Datei muss sich beim Start Ihrer Anwendung im Klassenpfad befinden. Legen Sie für ein Maven-Projekt die Datei im <project-dir>/src/main/resources Verzeichnis ab.

Die log4j2.xml Konfigurationsdatei gibt Eigenschaften wie die Protokollierungsebene an, an die die Protokollierungsausgabe gesendet wird (z. B. an eine Datei oder an die Konsole) und das Format der Ausgabe . Die Protokollierungsebene gibt den Detaillierungsgrad an, den Log4j 2 ausgibt. Log4j 2 unterstützt das Konzept mehrerer Protokollierungshierarchien. Die Protokollierungsebene wird für jede Hierarchie separat festgelegt. Die Hauptprotokollierungshierarchie, die Sie mit der verwenden, AWS SDK for Java 2.x ist software.amazon.awssdk.

Protokollierungsabhängigkeit hinzufügen

Verwenden Sie Folgendes, um die Log4j-2-Bindung für SLF4J in Ihrer Build-Datei zu konfigurieren.

Maven

Fügen Sie Ihrer pom.xml Datei die folgenden Elemente hinzu.

... <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j2-impl</artifactId> <version>VERSION</version> </dependency> ...
Gradle–Kotlin DSL

Fügen Sie Ihrer build.gradle.kts Datei Folgendes hinzu.

... dependencies { ... implementation("org.apache.logging.log4j:log4j-slf4j2-impl:VERSION") ... } ...

Verwenden Sie 2.20.0 für die Mindestversion des log4j-slf4j2-impl Artefakts. Verwenden Sie für die neueste Version die in Maven Central veröffentlichte Version. Ersetzen Sie VERSION durch die Version, die Sie verwenden werden.

SDK-spezifische Fehler und Warnungen

Wir empfehlen Ihnen, die Logger-Hierarchie „software.amazon.awssdk“ immer auf „WARN“ eingestellt zu lassen, um wichtige Nachrichten aus den Clientbibliotheken des SDK abzufangen. Wenn der Amazon S3-Client beispielsweise erkennt, dass Ihre Anwendung ein nicht ordnungsgemäß geschlossen hat InputStream und Ressourcen preisgeben könnte, meldet der S3-Client es über eine Warnmeldung an die Protokolle. Dadurch wird auch sichergestellt, dass Nachrichten protokolliert werden, wenn der Client Schwierigkeiten bei der Verarbeitung von Anforderungen oder Antworten hat.

Die folgende log4j2.xml Datei setzt rootLogger auf „WARN“, was dazu führt, dass Nachrichten auf Warn- und Fehlerebene von allen Loggern in der Anwendung ausgegeben werden, einschließlich solcher in der Hierarchie „software.amazon.awssdk“. Alternativ können Sie die Logger-Hierarchie „software.amazon.awssdk“ explizit auf „WARN“ setzen, wenn verwendet <Root level="ERROR"> wird.

Beispiel für eine Log4j2.xml-Konfigurationsdatei

Diese Konfiguration protokolliert Nachrichten auf den Ebenen „FEHLER“ und „WARN“ in der Konsole für alle Logger-Hierarchien.

<Configuration status="WARN"> <Appenders> <Console name="ConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n" /> </Console> </Appenders> <Loggers> <Root level="WARN"> <AppenderRef ref="ConsoleAppender"/> </Root> </Loggers> </Configuration>

Protokollierung der Anforderungs-/Antwortübersicht

Jede Anforderung an einen AWS-Service generiert eine eindeutige AWS Anforderungs-ID, die nützlich ist, wenn ein Problem damit auftritt, wie ein eine Anforderung AWS-Service verarbeitet. AWS Anforderungs-IDs sind programmgesteuert über SdkServiceException Objekte im SDK für fehlgeschlagene Service-Aufrufe zugänglich und können auch über die „DEBUG“-Protokollebene des Loggers „software.amazon.awsdk.request“ gemeldet werden.

Die folgende log4j2.xml Datei ermöglicht eine Zusammenfassung der Anforderungen und Antworten.

<Configuration status="WARN"> <Appenders> <Console name="ConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n" /> </Console> </Appenders> <Loggers> <Root level="ERROR"> <AppenderRef ref="ConsoleAppender"/> </Root> <Logger name="software.amazon.awssdk" level="WARN" /> <Logger name="software.amazon.awssdk.request" level="DEBUG" /> </Loggers> </Configuration>

Hier finden Sie ein Beispiel für die Protokollausgabe:

2022-09-23 16:02:08 [main] DEBUG software.amazon.awssdk.request:85 - Sending Request: DefaultSdkHttpFullRequest(httpMethod=POST, protocol=https, host=dynamodb.us-east-1.amazonaws.com, encodedPath=/, headers=[amz-sdk-invocation-id, Content-Length, Content-Type, User-Agent, X-Amz-Target], queryParameters=[]) 2022-09-23 16:02:08 [main] DEBUG software.amazon.awssdk.request:85 - Received successful response: 200, Request ID: QS9DUMME2NHEDH8TGT9N5V53OJVV4KQNSO5AEMVJF66Q9ASUAAJG, Extended Request ID: not available

Wenn Sie nur an der Anforderungs-ID interessiert sind, verwenden Sie <Logger name="software.amazon.awssdk.requestId" level="DEBUG" />.

Verbose-Wire-Protokollierung

Es kann nützlich sein, die genauen Anfragen und Antworten zu sehen, die das SDK for Java 2.x sendet und empfängt. Wenn Sie Zugriff auf diese Informationen benötigen, können Sie sie vorübergehend aktivieren, indem Sie die erforderliche Konfiguration je nach HTTP-Client hinzufügen, den der Service-Client verwendet.

Standardmäßig verwenden synchrone Service-Clients wie der S3Client einen zugrunde liegenden Apache HttpClientund asynchrone Service-Clients wie den S3AsyncClient einen nicht blockierenden Netty-HTTP-Client.

Hier finden Sie eine Aufschlüsselung der HTTP-Clients, die Sie für die beiden Kategorien von Service-Clients verwenden können:

Synchrone HTTP-Clients Asynchrone HTTP-Clients
ApacheHttpClient (Standard) NettyNioAsyncHttpClient (Standard)
UrlConnectionHttpClient AwsCrtAsyncHttpClient

Konfigurationseinstellungen, die Sie je nach zugrundeliegendem HTTP-Client hinzufügen müssen, finden Sie auf der entsprechenden Registerkarte unten.

Warnung

Wir empfehlen Ihnen, die Übertragungsprotokollierung ausschließlich für Debugging-Zwecke zu verwenden. Deaktivieren Sie sie in Produktionsumgebungen, da sie sensible Daten aufzeichnen kann. Sie protokolliert die gesamte Anfrage oder Antwort ohne Verschlüsselung, auch bei einem HTTPS-Aufruf. Bei großen Anforderungen (z. B. zum Hochladen einer Datei auf Amazon S3) oder Antworten kann die ausführliche Protokollierung auch die Leistung Ihrer Anwendung erheblich beeinträchtigen.

ApacheHttpClient

Fügen Sie der log4j2.xml Konfigurationsdatei den Logger „org.apache.http.Speed“ hinzu und setzen Sie die Stufe auf „DEBUG“.

Die folgende log4j2.xml Datei aktiviert die vollständige Wire-Protokollierung für den Apache HttpClient.

<Configuration status="WARN"> <Appenders> <Console name="ConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n" /> </Console> </Appenders> <Loggers> <Root level="WARN"> <AppenderRef ref="ConsoleAppender"/> </Root> <Logger name="software.amazon.awssdk" level="WARN" /> <Logger name="software.amazon.awssdk.request" level="DEBUG" /> <Logger name="org.apache.http.wire" level="DEBUG" /> </Loggers> </Configuration>

Eine zusätzliche Maven-Abhängigkeit vom log4j-1.2-api Artefakt ist für die Wire-Protokollierung mit Apache erforderlich, da 1.2 unter der Hintergrundumgebung verwendet wird.

Die vollständigen Maven-Abhängigkeiten für log4j 2, einschließlich der Wire-Protokollierung für den Apache-HTTP-Client, werden in den folgenden Build-Dateiausschnitten angezeigt.

Maven

... <dependencyManagement> ... <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-bom</artifactId> <version>VERSION</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ... <!-- The following is needed for Log4j2 with SLF4J --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j2-impl</artifactId> </dependency> <!-- The following is needed for Apache HttpClient wire logging --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-1.2-api</artifactId> </dependency> ...

Gradle-Kotlin-DSL

... dependencies { ... implementation(platform("org.apache.logging.log4j:log4j-bom:VERSION")) implementation("org.apache.logging.log4j:log4j-slf4j2-impl") implementation("org.apache.logging.log4j:log4j-1.2-api") } ...

Verwenden Sie 2.20.0 für die Mindestversion des log4j-bom Artefakts. Verwenden Sie für die neueste Version die in Maven Central veröffentlichte Version. Ersetzen Sie VERSION durch die Version, die Sie verwenden werden.

UrlConnectionHttpClient

Um Details für Service-Clients zu protokollieren, die die verwendenUrlConnectionHttpClient, erstellen Sie zunächst eine logging.properties Datei mit dem folgenden Inhalt:

handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level=FINEST sun.net.www.protocol.http.HttpURLConnection.level=ALL

Legen Sie die folgende JVM-Systemeigenschaft mit dem vollständigen Pfad des festlogging.properties:

-Djava.util.logging.config.file=/full/path/to/logging.properties

Diese Konfiguration protokolliert nur die Header der Anforderung und Antwort, zum Beispiel:

<Request> FINE: sun.net.www.MessageHeader@35a9782c11 pairs: {GET /fileuploadtest HTTP/1.1: null}{amz-sdk-invocation-id: 5f7e707e-4ac5-bef5-ba62-00d71034ffdc}{amz-sdk-request: attempt=1; max=4}{Authorization: AWS4-HMAC-SHA256 Credential=<deleted>/20220927/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;amz-sdk-request;host;x-amz-content-sha256;x-amz-date;x-amz-te, Signature=e367fa0bc217a6a65675bb743e1280cf12fbe8d566196a816d948fdf0b42ca1a}{User-Agent: aws-sdk-java/2.17.230 Mac_OS_X/12.5 OpenJDK_64-Bit_Server_VM/25.332-b08 Java/1.8.0_332 vendor/Amazon.com_Inc. io/sync http/UrlConnection cfg/retry-mode/legacy}{x-amz-content-sha256: UNSIGNED-PAYLOAD}{X-Amz-Date: 20220927T133955Z}{x-amz-te: append-md5}{Host: tkhill-test1.s3.amazonaws.com}{Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2}{Connection: keep-alive} <Response> FINE: sun.net.www.MessageHeader@70a36a6611 pairs: {null: HTTP/1.1 200 OK}{x-amz-id-2: sAFeZDOKdUMsBbkdjyDZw7P0oocb4C9KbiuzfJ6TWKQsGXHM/dFuOvr2tUb7Y1wEHGdJ3DSIxq0=}{x-amz-request-id: P9QW9SMZ97FKZ9X7}{Date: Tue, 27 Sep 2022 13:39:57 GMT}{Last-Modified: Tue, 13 Sep 2022 14:38:12 GMT}{ETag: "2cbe5ad4a064cedec33b452bebf48032"}{x-amz-transfer-encoding: append-md5}{Accept-Ranges: bytes}{Content-Type: text/plain}{Server: AmazonS3}{Content-Length: 67}

Um die Anforderungs-/Antworttexte anzuzeigen, fügen Sie -Djavax.net.debug=all zu den JVM-Eigenschaften hinzu. Diese zusätzliche Eigenschaft protokolliert eine Vielzahl von Informationen, einschließlich aller SSL-Informationen.

Suchen Sie in der Protokollkonsole oder der Protokolldatei nach "GET" oder , "POST" um schnell zum Abschnitt des Protokolls zu gelangen, der tatsächliche Anforderungen und Antworten enthält. Suchen Sie "Plaintext before ENCRYPTION" nach Anforderungen und "Plaintext after DECRYPTION" Antworten, um den vollständigen Text der Header und Textkörper anzuzeigen.

NettyNioAsyncHttpClient

Wenn Ihr asynchroner Service-Client den Standard- verwendetNettyNioAsyncHttpClient, fügen Sie Ihrer log4j2.xml Datei zwei zusätzliche Logger hinzu, um HTTP-Header und Anforderungs-/Antworttexte zu protokollieren.

<Logger name="io.netty.handler.logging" level="DEBUG" /> <Logger name="io.netty.handler.codec.http2.Http2FrameLogger" level="DEBUG" />

Hier ist ein vollständiges log4j2.xml Beispiel:

<Configuration status="WARN"> <Appenders> <Console name="ConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n" /> </Console> </Appenders> <Loggers> <Root level="WARN"> <AppenderRef ref="ConsoleAppender"/> </Root> <Logger name="software.amazon.awssdk" level="WARN" /> <Logger name="software.amazon.awssdk.request" level="DEBUG" /> <Logger name="io.netty.handler.logging" level="DEBUG" /> <Logger name="io.netty.handler.codec.http2.Http2FrameLogger" level="DEBUG" /> </Loggers> </Configuration>

Diese Einstellungen protokollieren alle Header-Details und Anforderungs-/Antworttexte.

AwsCrtAsyncHttpClient

Wenn Sie Ihren Service-Client für die Verwendung einer Instance von konfiguriert habenAwsCrtAsyncHttpClient, können Sie Details protokollieren, indem Sie die JVM-Systemeigenschaften oder programmgesteuert festlegen.

Log to a file at "Debug" level

Verwenden von Systemeigenschaften:

-Daws.crt.log.level=Trace -Daws.crt.log.destination=File -Daws.crt.log.filename=<path to file>

Programmgesteuert:

import software.amazon.awssdk.crt.Log; // Execute this statement before constructing the SDK service client. Log.initLoggingToFile(Log.LogLevel.Trace, "<path to file>");
Log to the console at "Debug" level

Verwenden von Systemeigenschaften:

-Daws.crt.log.level=Trace -Daws.crt.log.destination=Stdout

Programmgesteuert:

import software.amazon.awssdk.crt.Log; // Execute this statement before constructing the SDK service client. Log.initLoggingToStdout(Log.LogLevel.Trace);

Aus Sicherheitsgründen AwsCrtAsyncHttpClient protokolliert auf der Ebene „Trace“ nur Antwort-Header. Anforderungs-Header, Anforderungstexte und Antworttexte werden nicht protokolliert.