Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Enregistrez et surveillez les fonctions Java Lambda
AWS Lambda surveille automatiquement les fonctions Lambda et envoie des entrées de journal à Amazon. CloudWatch Votre fonction Lambda est fournie avec un groupe de CloudWatch journaux Logs et un flux de journaux pour chaque instance de votre fonction. L’environnement d’exécution Lambda envoie des détails sur chaque invocation et d’autres sorties provenant du code de votre fonction au flux de journaux. Pour plus d'informations sur CloudWatch les journaux, consultezUtilisation des CloudWatch journaux et journaux avec Lambda.
Pour produire des journaux à partir de votre code de fonction, vous pouvez utiliser des méthodes sur java.lang.System
Sections
- Création d’une fonction qui renvoie des journaux
- Utilisation des contrôles de journalisation avancés de Lambda avec Java
- Implémentation de la journalisation avancée avec Log4j2 et SLF4J
- Utilisation d'autres outils et bibliothèques de journalisation
- Utilisation de Powertools pour AWS Lambda (Java) et AWS SAM pour la journalisation structurée
- Afficher les journaux dans la console Lambda
- Afficher les journaux dans la CloudWatch console
- Afficher les journaux à l'aide de AWS Command Line Interface (AWS CLI)
- Suppression de journaux
- Exemple de code de journalisation
Création d’une fonction qui renvoie des journaux
Pour générer les journaux à partir de votre code de fonction, vous pouvez utiliser des méthodes sur java.lang.System stdout
ou stderr
. La aws-lambda-java-corebibliothèque fournit une classe d'enregistreur nommée à LambdaLogger
laquelle vous pouvez accéder depuis l'objet de contexte. La classe d’enregistreur prend en charge les journaux multilignes.
L’exemple suivant utilise l’enregistreur LambdaLogger
fourni par l’objet de contexte.
Exemple 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; } }
Exemple format des journaux
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
L’environnement d’exécution Java enregistre les lignes START
, END
et REPORT
pour chaque invocation. La ligne de rapport fournit les détails suivants.
REPORTchamps de données de ligne
-
RequestId— L'identifiant de demande unique pour l'invocation.
-
Duration – Temps que la méthode de gestion du gestionnaire de votre fonction a consacré au traitement de l’événement.
-
Billed Duration : temps facturé pour l’invocation.
-
Memory Size – Quantité de mémoire allouée à la fonction.
-
Max Memory Used – Quantité de mémoire utilisée par la fonction. Lorsque les invocations partagent un environnement d'exécution, Lambda indique la mémoire maximale utilisée pour toutes les invocations. Ce comportement peut entraîner une valeur signalée plus élevée que prévu.
-
Init Duration : pour la première requête servie, temps qu’il a pris à l’exécution charger la fonction et exécuter le code en dehors de la méthode du gestionnaire.
-
XRAY TraceId— Pour les demandes suivies, l'ID de AWS X-Ray trace.
-
SegmentId— Pour les demandes tracées, l'identifiant du segment X-Ray.
-
Sampled : pour les demandes suivies, résultat de l’échantillonnage.
Utilisation des contrôles de journalisation avancés de Lambda avec Java
Pour mieux contrôler la manière dont les journaux de vos fonctions sont capturés, traités et consommés, vous pouvez configurer les options de journalisation suivantes pour les environnements d’exécution Java pris en charge :
-
Format de journal : choisissez entre le format texte brut et le JSON format structuré pour les journaux de votre fonction
-
Niveau de journalisation : pour les journaux au JSON format, choisissez le niveau de détail des journaux auxquels Lambda envoie CloudWatch, par exempleERROR, DEBUG ou INFO
-
Groupe de journaux : choisissez le groupe de CloudWatch journaux auquel votre fonction envoie les journaux
Pour plus d’informations sur ces options de journalisation et pour savoir comment configurer votre fonction pour les utiliser, consultez Configuration de contrôles de journalisation avancés pour les fonctions Lambda.
Pour utiliser le format de journal et les options de niveau de journal avec vos fonctions Java Lambda, consultez les instructions des sections suivantes.
Utilisation d'un format de JSON journal structuré avec Java
Si vous sélectionnez le JSON format de journal de votre fonction, Lambda enverra les journaux en utilisant la LambdaLogger
classe telle que structurée. JSON Chaque objet JSON journal contient au moins quatre paires clé-valeur avec les clés suivantes :
-
"timestamp"
- heure à laquelle le message de journal a été généré -
"level"
- niveau de journalisation attribué au message -
"message"
- contenu du message de journal -
"AWSrequestId"
- identifiant unique de la demande pour l’invocation de la fonction
Selon la méthode de journalisation que vous utilisez, les sorties de journal de votre fonction capturées au JSON format peuvent également contenir des paires clé-valeur supplémentaires.
Pour attribuer un niveau aux journaux que vous créez à l’aide de l’enregistreur LambdaLogger
, vous devez fournir un argument LogLevel
dans votre commande de journalisation, comme illustré dans l’exemple suivant.
Exemple Code de journalisation Java
LambdaLogger logger = context.getLogger(); logger.log("This is a debug log", LogLevel.DEBUG);
Cette sortie de journal produite par cet exemple de code serait capturée dans CloudWatch Logs comme suit :
Exemple JSONenregistrement du journal
{
"timestamp":"2023-11-01T00:21:51.358Z",
"level":"DEBUG",
"message":"This is a debug log",
"AWSrequestId":"93f25699-2cbf-4976-8f94-336a0aa98c6f"
}
Si vous n'attribuez aucun niveau à la sortie de votre journal, Lambda lui attribuera automatiquement le niveau. INFO
Si votre code utilise déjà une autre bibliothèque de journalisation pour produire des journaux JSON structurés, vous n'avez aucune modification à apporter. Lambda ne double code aucun journal déjà codé. JSON Même si vous configurez votre fonction pour utiliser le format JSON journal, vos sorties de journalisation apparaissent CloudWatch dans la JSON structure que vous définissez.
Utilisation du filtrage au niveau du journal avec Java
AWS Lambda Pour filtrer les journaux de vos applications en fonction de leur niveau de journalisation, votre fonction doit utiliser des journaux JSON formatés. Vous pouvez effectuer cette opération de deux façons :
-
Créez des sorties de journal à l'aide de la norme
LambdaLogger
et configurez votre fonction pour utiliser le formatage des JSON journaux. Lambda filtre ensuite les sorties de votre journal à l'aide de la paire clé-valeur « niveau » de l'JSONobjet décrit dans. Utilisation d'un format de JSON journal structuré avec Java Pour savoir comment configurer le format de journal de votre fonction, consultez Configuration de contrôles de journalisation avancés pour les fonctions Lambda. -
Utilisez une autre bibliothèque ou méthode de journalisation pour créer des journaux JSON structurés dans votre code qui incluent une paire clé-valeur « niveau » définissant le niveau de sortie du journal. Vous pouvez utiliser n'importe quelle bibliothèque de journalisation capable d'écrire JSON des journaux dans
stdout
oustderr
. Par exemple, vous pouvez utiliser Powertools for AWS Lambda ou le package Log4j2 pour générer des sorties de journal JSON structurées à partir de votre code. Pour en savoir plus, consultez Utilisation de Powertools pour AWS Lambda (Java) et AWS SAM pour la journalisation structurée et Implémentation de la journalisation avancée avec Log4j2 et SLF4J.
Lorsque vous configurez votre fonction pour utiliser le filtrage au niveau des journaux, vous devez sélectionner l'une des options suivantes pour le niveau de journaux que Lambda doit envoyer à Logs : CloudWatch
Niveau de journalisation | Utilisation standard |
---|---|
TRACE(le plus détaillé) | Les informations les plus précises utilisées pour tracer le chemin d’exécution de votre code |
DEBUG | Informations détaillées pour le débogage du système |
INFO | Messages qui enregistrent le fonctionnement normal de votre fonction |
WARN | Messages relatifs à des erreurs potentielles susceptibles d’entraîner un comportement inattendu si elles ne sont pas traitées |
ERROR | Messages concernant les problèmes qui empêchent le code de fonctionner comme prévu |
FATAL(moindre détail) | Messages relatifs à des erreurs graves entraînant l’arrêt du fonctionnement de l’application |
Pour que Lambda puisse filtrer les journaux de votre fonction, vous devez également inclure une paire "timestamp"
clé-valeur dans la sortie de votre JSON journal. L'heure doit être spécifiée dans un format d'horodatage RFC3339
Lambda envoie les journaux du niveau sélectionné et d'un niveau inférieur à. CloudWatch Par exemple, si vous configurez un niveau de journalisation deWARN, Lambda enverra des journaux correspondant aux niveaux WARNERROR, etFATAL.
Implémentation de la journalisation avancée avec Log4j2 et SLF4J
Note
AWS Lambda n'inclut pas Log4j2 dans ses environnements d'exécution gérés ni dans ses images de conteneur de base. Ils ne sont donc pas concernés par les problèmes décrits dans CVE -2021-44228, -2021-45046 et CVE -2021-45105. CVE
Dans les cas où une fonction client inclut une version de Log4j2 affectée, nous avons apporté une modification aux environnements d'exécution gérés par Lambda Java et aux images des conteneurs de base afin d'atténuer les problèmes dans les versions -2021-44228, -2021-45046 et CVE -2021-45105. CVE CVE À la suite de cette modification, les clients utilisant Log4J2 peuvent voir une entrée de journal supplémentaire, similaire à « Transforming org/apache/logging/log4j/core/lookup/JndiLookup (java.net.URLClassLoader@...)
». Toute chaîne de journal qui fait référence au mappeur jndi dans la sortie Log4J2 sera remplacée par « Patched JndiLookup::lookup()
».
Indépendamment de ce changement, nous encourageons vivement tous les clients dont les fonctions incluent Log4j2 à mettre à jour vers la dernière version. Plus précisément, les clients utilisant la bibliothèque aws-lambda-java -log4j2 dans leurs fonctions doivent passer à la version 1.5.0 (ou ultérieure) et redéployer leurs fonctions. Cette version met à jour les dépendances sous-jacentes de l’utilitaire Log4j2 vers la version 2.17.0 (ou ultérieure). Le binaire aws-lambda-java -log4j2 mis à jour est disponible dans le dépôt Maven
Enfin, notez que les bibliothèques liées à aws-lambda-java-log4j (v1.0.0 ou 1.0.1) ne doivent en aucun cas être utilisées. Ces bibliothèques sont liées à la version 1.x de log4j qui a pris fin en 2015. Les bibliothèques ne sont pas prises en charge, ne sont pas maintenues, ne sont pas corrigées et présentent des failles de sécurité connues.
Pour personnaliser la sortie du journal, prendre en charge la journalisation pendant les tests unitaires et enregistrer les AWS SDK appels, utilisez Apache Log4j2 avec. SLF4J Log4j est une bibliothèque de journalisation pour les programmes Java qui vous permet de configurer les niveaux de journalisation et d’utiliser les bibliothèques appender. SLF4Jest une bibliothèque de façade qui vous permet de changer la bibliothèque que vous utilisez sans changer le code de votre fonction.
Pour ajouter l'ID de demande aux journaux de votre fonction, utilisez l'annexe de la bibliothèque aws-lambda-java-log4j2.
Exemple src/main/resources/log4j2.xml – Configuration de l’Appender
<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>
Vous pouvez décider comment vos journaux Log4j2 sont configurés pour le texte brut ou pour les JSON sorties en spécifiant une mise en page sous les <LambdaTextFormat>
balises et. <LambdaJSONFormat>
Dans cet exemple, en mode texte, chaque ligne est précédée de la date, de l’heure, de l’ID de demande, du niveau de journal et du nom de classe. En JSON mode, le <JsonTemplateLayout>
est utilisé avec une configuration fournie avec la aws-lambda-java-log4j2
bibliothèque.
SLF4Jest une bibliothèque de façade permettant de se connecter en code Java. Dans votre code de fonction, vous utilisez l'usine d'enregistrement pour récupérer un SLF4J enregistreur avec des méthodes pour les niveaux de journalisation telles que info()
et. warn()
Dans votre configuration de compilation, vous incluez la bibliothèque de journalisation et l'SLF4Jadaptateur dans le chemin de classe. En changeant les bibliothèques dans la configuration de build, vous pouvez changer le type d’enregistreur sans changer votre code de fonction. SLF4Jest nécessaire pour capturer les journaux SDK depuis Java.
Dans l'exemple de code suivant, la classe de gestionnaire utilise SLF4J pour récupérer un enregistreur.
Exemple src/main/java/example/HandlerS3.java — Connexion avec 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"; } }
Ce code produit des sorties de journal similaires à ce qui suit :
Exemple format des journaux
{ "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/" }
La configuration de construction prend en compte les dépendances d'exécution sur l'appendice et l'SLF4Jadaptateur Lambda, ainsi que les dépendances d'implémentation sur Log4j2.
Exemple build.gradle – Dépendances de journalisation
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,)', ... }
Lorsque vous exécutez votre code localement pour des tests, l’objet contecte avec l’enregistreur Lambda n’est pas disponible, et il n’y a pas d’ID de requête que l’appender Lambda puisse utiliser. Pour des exemples de configurations de test, consultez les exemples d’applications dans la section suivante.
Utilisation d'autres outils et bibliothèques de journalisation
Powertools for AWS Lambda (Java)
Capturez les champs clés du contexte Lambda, du démarrage à froid et des structures enregistrant la sortie sous JSON
Journaliser les événements d’invocation Lambda lorsque cela est demandé (désactivé par défaut)
Imprimer tous les journaux uniquement pour un pourcentage d’invocations via l’échantillonnage des journaux (désactivé par défaut)
Ajouter des clés supplémentaires au journal structuré à tout moment
Utilisez un formateur de journal personnalisé (Bring Your Own Formatter) pour générer les journaux dans une structure compatible avec la journalisation de votre organisation RFC
Utilisation de Powertools pour AWS Lambda (Java) et AWS SAM pour la journalisation structurée
Suivez les étapes ci-dessous pour télécharger, créer et déployer un exemple d'application Java Hello World avec des modules Powertools for AWS Lambda (Java) ~hello world
.
Prérequis
Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :
-
Java 11
-
AWS SAM CLIversion 1.75 ou ultérieure. Si vous possédez une ancienne version du AWS SAM CLI, consultez la section Mise à niveau du AWS SAM CLI.
Déployer un exemple d' AWS SAM application
-
Initialisez l’application à l’aide du modèle Hello World Java.
sam init --app-template hello-world-powertools-java --name sam-app --package-type Zip --runtime java11 --no-tracing
-
Créez l’application.
cd sam-app && sam build
-
Déployez l’application.
sam deploy --guided
-
Suivez les invites à l’écran. Appuyez sur
Enter
pour accepter les options par défaut fournies dans l’expérience interactive.Note
Car l'autorisation n'a HelloWorldFunction peut-être pas été définie, est-ce que ça va ? , assurez-vous de participer
y
. -
Obtenez le code URL de l'application déployée :
aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
-
Appelez le API point de terminaison :
curl -X GET
<URL_FROM_PREVIOUS_STEP>
En cas de succès, vous obtiendrez cette réponse :
{"message":"hello world"}
-
Pour obtenir les journaux de la fonction, exécutez sam logs. Pour en savoir plus, consultez Utilisation des journaux dans le Guide du développeur AWS Serverless Application Model .
sam logs --stack-name sam-app
La sortie du journal se présente comme suit :
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
-
Il s'agit d'un API point de terminaison public accessible via Internet. Nous vous recommandons de supprimer le point de terminaison après un test.
sam delete
Gestion de la conservation des journaux
Les groupes de journaux ne sont pas supprimés automatiquement quand vous supprimez une fonction. Pour éviter de stocker les journaux indéfiniment, supprimez le groupe de journaux ou configurez une période de conservation après laquelle les journaux CloudWatch sont automatiquement supprimés. Pour configurer la conservation des journaux, ajoutez ce qui suit à votre AWS SAM modèle :
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: # Omitting other properties LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}" RetentionInDays: 7
Afficher les journaux dans la console Lambda
Vous pouvez utiliser la console Lambda pour afficher la sortie du journal après avoir invoqué une fonction Lambda.
Si votre code peut être testé à partir de l’éditeur Code intégré, vous trouverez les journaux dans les résultats d’exécution. Lorsque vous utilisez la fonctionnalité de test de console pour invoquer une fonction, vous trouverez Sortie du journal dans la section Détails.
Afficher les journaux dans la CloudWatch console
Vous pouvez utiliser la CloudWatch console Amazon pour consulter les journaux de toutes les invocations de fonctions Lambda.
Pour afficher les journaux sur la CloudWatch console
-
Ouvrez la page Groupes de journaux
sur la CloudWatch console. -
Choisissez le groupe de journaux pour votre fonction (/aws/lambda/
your-function-name
). -
Choisissez un flux de journaux.
Chaque flux de journal correspond à une instance de votre fonction. Un flux de journaux apparaît lorsque vous mettez à jour votre fonction Lambda et lorsque des instances supplémentaires sont créées pour traiter plusieurs invocations simultanées. Pour trouver les journaux d'un appel spécifique, nous vous recommandons d'instrumenter votre fonction avec. AWS X-Ray X-Ray enregistre des détails sur la demande et le flux de journaux dans le suivi.
Afficher les journaux à l'aide de AWS Command Line Interface (AWS CLI)
AWS CLI Il s'agit d'un outil open source qui vous permet d'interagir avec les AWS services à l'aide de commandes dans votre interface de ligne de commande. Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :
Vous pouvez utiliser AWS CLI pour récupérer les journaux d’une invocation à l’aide de l’option de commande --log-type
. La réponse inclut un champ LogResult
qui contient jusqu’à 4 Ko de journaux codés en base64 provenant de l’invocation.
Exemple récupérer un ID de journal
L’exemple suivant montre comment récupérer un ID de journal à partir du champ LogResult
d’une fonction nommée my-function
.
aws lambda invoke --function-name my-function out --log-type Tail
Vous devriez voir la sortie suivante:
{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
Exemple décoder les journaux
Dans la même invite de commandes, utilisez l’utilitaire base64
pour décoder les journaux. L’exemple suivant montre comment récupérer les journaux encodés en base64 pour 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
L'cli-binary-formatoption est obligatoire si vous utilisez AWS CLI la version 2. Pour faire de ce paramètre le paramètre par défaut, exécutez aws configure set cli-binary-format raw-in-base64-out
. Pour plus d’informations, consultez les options de ligne de commande globales AWS CLI prises en charge dans le Guide de l’utilisateur AWS Command Line Interface version 2.
Vous devriez voir la sortie suivante :
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
L’utilitaire base64
est disponible sous Linux, macOS et Ubuntu sous Windowsbase64 -D
.
Exemple Script get-logs.sh
Dans la même invite de commandes, utilisez le script suivant pour télécharger les cinq derniers événements de journalisation. Le script utilise sed
pour supprimer les guillemets du fichier de sortie et attend 15 secondes pour permettre la mise à disposition des journaux. La sortie comprend la réponse de Lambda, ainsi que la sortie de la commande get-log-events
.
Copiez le contenu de l’exemple de code suivant et enregistrez-le dans votre répertoire de projet Lambda sous get-logs.sh
.
L'cli-binary-formatoption est obligatoire si vous utilisez AWS CLI la version 2. Pour faire de ce paramètre le paramètre par défaut, exécutez aws configure set cli-binary-format raw-in-base64-out
. Pour plus d’informations, consultez les options de ligne de commande globales AWS CLI prises en charge dans le Guide de l’utilisateur AWS Command Line Interface 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
Exemple macOS et Linux (uniquement)
Dans la même invite de commandes, les utilisateurs macOS et Linux peuvent avoir besoin d’exécuter la commande suivante pour s’assurer que le script est exécutable.
chmod -R 755 get-logs.sh
Exemple récupérer les cinq derniers événements de journal
Dans la même invite de commande, exécutez le script suivant pour obtenir les cinq derniers événements de journalisation.
./get-logs.sh
Vous devriez voir la sortie suivante:
{ "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" }
Suppression de journaux
Les groupes de journaux ne sont pas supprimés automatiquement quand vous supprimez une fonction. Pour éviter de stocker des journaux indéfiniment, supprimez le groupe de journaux ou configurez une période de conservation à l’issue de laquelle les journaux sont supprimés automatiquement.
Exemple de code de journalisation
Le GitHub référentiel de ce guide inclut des exemples d'applications illustrant l'utilisation de différentes configurations de journalisation. Chaque exemple d'application inclut des scripts pour faciliter le déploiement et le nettoyage, un AWS SAM modèle et des ressources de support.
Exemples d’applications Lambda en Java
-
java17-examples
: fonction Java qui montre comment utiliser un enregistrement Java pour représenter un objet de données d’événement en entrée. -
java-basic
– Ensemble de fonctions Java minimales avec des tests unitaires et une configuration de journalisation variable. -
java-events
— Ensemble de fonctions Java contenant du code squelette expliquant comment gérer les événements provenant de divers services tels qu'Amazon API GatewaySQS, Amazon et Amazon Kinesis. Ces fonctions utilisent la dernière version de la aws-lambda-java-eventsbibliothèque (3.0.0 et versions ultérieures). Ces exemples ne nécessitent pas le AWS SDK comme dépendance. -
s3-java
— Fonction Java qui traite les événements de notification provenant d'Amazon S3 et utilise la bibliothèque de classes Java (JCL) pour créer des miniatures à partir de fichiers image téléchargés. -
Utilisez API Gateway pour appeler une fonction Lambda : fonction Java qui analyse une table Amazon DynamoDB contenant des informations sur les employés. Il utilise ensuite Amazon Simple Notification Service pour envoyer un message texte aux employés qui fêtent leur anniversaire professionnel. Cet exemple utilise API Gateway pour appeler la fonction.
L’exemple java-basic
d’application présente une configuration de journalisation minimale qui prend en charge les tests de journalisation. Le code du gestionnaire utilise l’enregistreur LambdaLogger
fourni par l’objet de contexte. Pour les tests, l’application utilise une classe TestLogger
personnalisée qui implémente l’interface LambdaLogger
avec un logger Log4j2. Il est utilisé SLF4J comme façade pour assurer la compatibilité avec le AWS SDK. Les bibliothèques de journalisation sont exclues de la sortie de build pour limiter la taille du package de déploiement.