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:
Konfigurationseinstellungen, die Sie je nach zugrundeliegendem HTTP-Client hinzufügen müssen, finden Sie auf der entsprechenden Registerkarte unten.
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.