Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Log dan pantau fungsi Java Lambda
AWS Lambda secara otomatis memonitor fungsi Lambda dan mengirim entri log ke Amazon. CloudWatch Fungsi Lambda Anda dilengkapi dengan grup CloudWatch log Log dan aliran log untuk setiap instance fungsi Anda. Lingkungan runtime Lambda mengirimkan detail tentang setiap pemanggilan dan output lainnya dari kode fungsi Anda ke aliran log. Untuk informasi selengkapnya tentang CloudWatch Log, lihatMenggunakan CloudWatch log Log dengan Lambda.
Untuk mengeluarkan log dari kode fungsi Anda, Anda dapat menggunakan metode di java.lang.System
Bagian-bagian
- Membuat fungsi yang mengembalikan log
- Menggunakan kontrol logging lanjutan Lambda dengan Java
- Menerapkan logging lanjutan dengan Log4j2 dan SLF4J
- Menggunakan alat logging dan pustaka lainnya
- Menggunakan Powertools untuk AWS Lambda (Java) dan AWS SAM untuk logging terstruktur
- Melihat log di konsol Lambda
- Melihat log di CloudWatch konsol
- Melihat log menggunakan AWS Command Line Interface (AWS CLI)
- Menghapus log
- Kode pencatatan sampel
Membuat fungsi yang mengembalikan log
Untuk menghasilkan log dari kode fungsi, Anda dapat menggunakan metode di java.lang.Systemstdout
atau stderr
. aws-lambda-java-corePustaka menyediakan kelas logger bernama LambdaLogger
yang dapat Anda akses dari objek konteks. Kelas logger mendukung log beberapa baris.
Contoh berikut menggunakan logger LambdaLogger
yang disediakan oleh objek konteks.
contoh 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; } }
contoh format log
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
Runtime Java mencatat baris START
, END
, dan REPORT
untuk setiap invokasi. Baris laporan memberikan detail berikut:
REPORTbidang data baris
-
RequestId— ID permintaan unik untuk pemanggilan.
-
Durasi – Jumlah waktu yang digunakan oleh metode handler fungsi Anda gunakan untuk memproses peristiwa.
-
Durasi yang Ditagih – Jumlah waktu yang ditagihkan untuk invokasi.
-
Ukuran Memori – Jumlah memori yang dialokasikan untuk fungsi.
-
Memori Maks yang Digunakan – Jumlah memori yang digunakan oleh fungsi. Saat pemanggilan berbagi lingkungan eksekusi, Lambda melaporkan memori maksimum yang digunakan di semua pemanggilan. Perilaku ini dapat menghasilkan nilai yang dilaporkan lebih tinggi dari yang diharapkan.
-
Durasi Init – Untuk permintaan pertama yang dilayani, lama waktu yang diperlukan runtime untuk memuat fungsi dan menjalankan kode di luar metode handler.
-
XRAY TraceId— Untuk permintaan yang dilacak, ID AWS X-Ray jejak.
-
SegmentId— Untuk permintaan yang dilacak, ID segmen X-Ray.
-
Diambil Sampel – Untuk permintaan yang dilacak, hasil pengambilan sampel.
Menggunakan kontrol logging lanjutan Lambda dengan Java
Untuk memberi Anda kontrol lebih besar atas bagaimana log fungsi Anda ditangkap, diproses, dan dikonsumsi, Anda dapat mengonfigurasi opsi logging berikut untuk runtime Java yang didukung:
-
Format log - pilih antara teks biasa dan JSON format terstruktur untuk log fungsi Anda
-
Tingkat log - untuk log dalam JSON format, pilih tingkat detail log yang dikirim Lambda ke CloudWatch, seperti,ERROR, DEBUG atau INFO
-
Grup log - pilih grup CloudWatch log fungsi Anda mengirim log ke
Untuk informasi selengkapnya tentang opsi pencatatan ini, dan petunjuk tentang cara mengonfigurasi fungsi Anda untuk menggunakannya, lihatMengkonfigurasi kontrol logging lanjutan untuk fungsi Lambda.
Untuk menggunakan format log dan opsi tingkat log dengan fungsi Java Lambda Anda, lihat panduan di bagian berikut.
Menggunakan format JSON log terstruktur dengan Java
Jika Anda memilih JSON untuk format log fungsi Anda, Lambda akan mengirim log output menggunakan LambdaLogger
kelas sebagai terstruktur. JSON Setiap objek JSON log berisi setidaknya empat pasangan nilai kunci dengan kunci berikut:
-
"timestamp"
- waktu pesan log dihasilkan -
"level"
- tingkat log yang ditetapkan untuk pesan -
"message"
- isi pesan log -
"AWSrequestId"
- ID permintaan unik untuk pemanggilan fungsi
Bergantung pada metode logging yang Anda gunakan, output log dari fungsi yang diambil dalam JSON format juga dapat berisi pasangan nilai kunci tambahan.
Untuk menetapkan level ke log yang Anda buat menggunakan LambdaLogger
logger, Anda perlu memberikan LogLevel
argumen dalam perintah logging seperti yang ditunjukkan pada contoh berikut.
contoh Kode logging Java
LambdaLogger logger = context.getLogger(); logger.log("This is a debug log", LogLevel.DEBUG);
Output log ini dengan kode contoh ini akan ditangkap di CloudWatch Log sebagai berikut:
contoh JSONcatatan log
{
"timestamp":"2023-11-01T00:21:51.358Z",
"level":"DEBUG",
"message":"This is a debug log",
"AWSrequestId":"93f25699-2cbf-4976-8f94-336a0aa98c6f"
}
Jika Anda tidak menetapkan level ke output log Anda, Lambda akan secara otomatis menetapkan levelnya. INFO
Jika kode Anda sudah menggunakan pustaka logging lain untuk menghasilkan log JSON terstruktur, Anda tidak perlu membuat perubahan apa pun. Lambda tidak menyandikan dua kali log apa pun yang sudah dikodekan. JSON Bahkan jika Anda mengonfigurasi fungsi Anda untuk menggunakan format JSON log, output logging Anda muncul CloudWatch dalam JSON struktur yang Anda tentukan.
Menggunakan penyaringan tingkat log dengan Java
AWS Lambda Untuk memfilter log aplikasi Anda sesuai dengan tingkat lognya, fungsi Anda harus menggunakan log JSON yang diformat. Anda dapat mencapai ini dengan dua cara:
-
Buat output log menggunakan standar
LambdaLogger
dan konfigurasikan fungsi Anda untuk menggunakan pemformatan JSON log. Lambda kemudian memfilter output log Anda menggunakan pasangan nilai kunci “level” di JSON objek yang dijelaskan di. Menggunakan format JSON log terstruktur dengan Java Untuk mempelajari cara mengonfigurasi format log fungsi Anda, lihatMengkonfigurasi kontrol logging lanjutan untuk fungsi Lambda. -
Gunakan pustaka atau metode logging lain untuk membuat log JSON terstruktur dalam kode Anda yang menyertakan pasangan nilai kunci “level” yang menentukan tingkat output log. Anda dapat menggunakan pustaka logging apa pun yang dapat menulis JSON log ke
stdout
ataustderr
. Misalnya, Anda dapat menggunakan Powertools for AWS Lambda atau paket Log4j2 untuk menghasilkan output log JSON terstruktur dari kode Anda. Lihat Menggunakan Powertools untuk AWS Lambda (Java) dan AWS SAM untuk logging terstruktur dan Menerapkan logging lanjutan dengan Log4j2 dan SLF4J untuk mempelajari lebih lanjut.
Ketika Anda mengonfigurasi fungsi Anda untuk menggunakan pemfilteran tingkat log, Anda harus memilih dari opsi berikut untuk tingkat log yang ingin Lambda kirim ke Log: CloudWatch
Tingkat log | Penggunaan standar |
---|---|
TRACE(paling detail) | Informasi paling halus yang digunakan untuk melacak jalur eksekusi kode Anda |
DEBUG | Informasi terperinci untuk debugging sistem |
INFO | Pesan yang merekam operasi normal fungsi Anda |
WARN | Pesan tentang potensi kesalahan yang dapat menyebabkan perilaku tak terduga jika tidak ditangani |
ERROR | Pesan tentang masalah yang mencegah kode berfungsi seperti yang diharapkan |
FATAL(paling detail) | Pesan tentang kesalahan serius yang menyebabkan aplikasi berhenti berfungsi |
Agar Lambda dapat memfilter log fungsi Anda, Anda juga harus menyertakan pasangan nilai "timestamp"
kunci dalam output JSON log Anda. Waktu harus ditentukan dalam format stempel waktu RFC3339
Lambda mengirimkan log dari level yang dipilih dan lebih rendah ke. CloudWatch Misalnya, jika Anda mengonfigurasi tingkat logWARN, Lambda akan mengirim log yang sesuai denganWARN,ERROR, dan FATAL level.
Menerapkan logging lanjutan dengan Log4j2 dan SLF4J
catatan
AWS Lambda tidak menyertakan Log4j2 dalam runtime terkelola atau gambar wadah dasarnya. Oleh karena itu, ini tidak terpengaruh oleh masalah yang dijelaskan dalam CVE -2021-44228, -2021-45046, CVE dan -2021-45105. CVE
Untuk kasus di mana fungsi pelanggan menyertakan versi Log4j2 yang terpengaruh, kami telah menerapkan perubahan pada runtime terkelola Lambda Java dan gambar wadah dasar yang membantu mengurangi masalah di -2021-44228, -2021-45046, dan -2021-45105. CVE CVE CVE Sebagai hasil dari perubahan ini, pelanggan yang menggunakan Log4J2 mungkin melihat entri log tambahan, mirip dengan "”. Transforming org/apache/logging/log4j/core/lookup/JndiLookup (java.net.URLClassLoader@...)
String log apa pun yang mereferensikan jndi mapper di output Log4J2 akan diganti dengan "”. Patched JndiLookup::lookup()
Terlepas dari perubahan ini, kami sangat mendorong semua pelanggan yang fungsinya termasuk Log4j2 untuk memperbarui ke versi terbaru. Secara khusus, pelanggan yang menggunakan pustaka aws-lambda-java -log4j2 dalam fungsinya harus memperbarui ke versi 1.5.0 (atau yang lebih baru), dan menerapkan ulang fungsinya. Versi ini memperbarui dependensi utilitas Log4j2 yang mendasarinya ke versi 2.17.0 (atau yang lebih baru). Biner aws-lambda-java -log4j2 yang diperbarui tersedia di repositori Maven
Terakhir, perhatikan bahwa pustaka apa pun yang terkait dengan aws-lambda-java-log4j (v1.0.0 atau 1.0.1) tidak boleh digunakan dalam keadaan apa pun. Pustaka ini terkait dengan versi 1.x dari log4j yang berakhir pada tahun 2015. Pustaka tidak didukung, tidak dipelihara, tidak ditambal, dan memiliki kerentanan keamanan yang diketahui.
Untuk menyesuaikan output log, mendukung pencatatan selama pengujian unit, dan AWS SDK panggilan log, gunakan Apache Log4j2 dengan. SLF4J Log4j adalah pustaka log untuk program Java yang memungkinkan Anda mengonfigurasi tingkat log dan menggunakan pustaka appender. SLF4Jadalah pustaka fasad yang memungkinkan Anda mengubah perpustakaan mana yang Anda gunakan tanpa mengubah kode fungsi Anda.
Untuk menambahkan ID permintaan ke log fungsi Anda, gunakan appender di pustaka aws-lambda-java-log4j2.
contoh src/main/resources/log4j2.xml – Konfigurasi 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>
Anda dapat memutuskan bagaimana log Log4j2 Anda dikonfigurasi untuk teks biasa atau JSON output dengan menentukan tata letak di bawah tag dan. <LambdaTextFormat>
<LambdaJSONFormat>
Dalam contoh ini, dalam mode teks, setiap baris ditambahkan dengan tanggal, waktu, ID permintaan, tingkat log, dan nama kelas. Dalam JSON mode, <JsonTemplateLayout>
digunakan dengan konfigurasi yang dikirimkan bersama dengan aws-lambda-java-log4j2
perpustakaan.
SLF4Jadalah pustaka fasad untuk login dalam kode Java. Dalam kode fungsi Anda, Anda menggunakan pabrik SLF4J logger untuk mengambil logger dengan metode untuk tingkat log seperti dan. info()
warn()
Dalam konfigurasi build, Anda menyertakan library logging dan SLF4J adaptor di classpath. Dengan mengubah pustaka dalam konfigurasi build, Anda dapat mengubah tipe logger tanpa mengubah kode fungsi Anda. SLF4Jdiperlukan untuk menangkap log dari SDK untuk Java.
Dalam contoh kode berikut, kelas handler menggunakan SLF4J untuk mengambil logger.
contoh src/main/java/example/HandlerS3.java - Logging dengan 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"; } }
Kode ini menghasilkan output log seperti berikut:
contoh format log
{ "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/" }
Konfigurasi build mengambil dependensi runtime pada appender dan SLF4J adaptor Lambda, serta dependensi implementasi pada Log4j2.
contoh build.gradle – dependensi pencatatan
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,)', ... }
Saat Anda menjalankan kode Anda secara lokal untuk pengujian, objek konteks dengan logger Lambda tidak tersedia, dan tidak ada ID permintaan untuk appender Lambda untuk digunakan. Misalnya konfigurasi uji, lihat aplikasi sampel di bagian berikutnya.
Menggunakan alat logging dan pustaka lainnya
Powertools for AWS Lambda (Java)
Tangkap bidang kunci dari konteks Lambda, cold start, dan struktur logging output sebagai JSON
Log peristiwa pemanggilan Lambda saat diinstruksikan (dinonaktifkan secara default)
Cetak semua log hanya untuk persentase pemanggilan melalui pengambilan sampel log (dinonaktifkan secara default)
Tambahkan kunci tambahan ke log terstruktur kapan saja
Gunakan pemformat log kustom (Bring Your Own Formatter) untuk mengeluarkan log dalam struktur yang kompatibel dengan Logging organisasi Anda RFC
Menggunakan Powertools untuk AWS Lambda (Java) dan AWS SAM untuk logging terstruktur
Ikuti langkah-langkah di bawah ini untuk mengunduh, membangun, dan menyebarkan contoh aplikasi Hello World Java dengan Powertools terintegrasi untuk AWS Lambda (Java) ~hello world
pesan.
Prasyarat
Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
-
Java 11
-
AWS SAM CLIversi 1.75 atau yang lebih baru. Jika Anda memiliki versi yang lebih lama AWS SAM CLI, lihat Memutakhirkan file. AWS SAM CLI
Menyebarkan aplikasi sampel AWS SAM
-
Inisialisasi aplikasi menggunakan template Hello World Java.
sam init --app-template hello-world-powertools-java --name sam-app --package-type Zip --runtime java11 --no-tracing
-
Bangun aplikasi.
cd sam-app && sam build
-
Terapkan aplikasi.
sam deploy --guided
-
Ikuti petunjuk di layar. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, tekan
Enter
.catatan
Karena HelloWorldFunction mungkin tidak memiliki otorisasi yang ditentukan, Apakah ini baik-baik saja? , pastikan untuk masuk
y
. -
Dapatkan aplikasi yang digunakan: URL
aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
-
Memanggil titik API akhir:
curl -X GET
<URL_FROM_PREVIOUS_STEP>
Jika berhasil, Anda akan melihat tanggapan ini:
{"message":"hello world"}
-
Untuk mendapatkan log untuk fungsi tersebut, jalankan log sam. Untuk informasi selengkapnya, lihat Bekerja dengan log di Panduan AWS Serverless Application Model Pengembang.
sam logs --stack-name sam-app
Output log terlihat seperti ini:
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
-
Ini adalah API titik akhir publik yang dapat diakses melalui internet. Kami menyarankan Anda menghapus titik akhir setelah pengujian.
sam delete
Mengelola retensi log
Grup log tidak terhapus secara otomatis ketika Anda menghapus suatu fungsi. Untuk menghindari penyimpanan log tanpa batas waktu, hapus grup log, atau konfigurasikan periode retensi setelah itu secara CloudWatch otomatis menghapus log. Untuk mengatur penyimpanan log, tambahkan yang berikut ini ke AWS SAM templat Anda:
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: # Omitting other properties LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}" RetentionInDays: 7
Melihat log di konsol Lambda
Anda dapat menggunakan konsol Lambda untuk melihat output log setelah Anda memanggil fungsi Lambda.
Jika kode Anda dapat diuji dari editor Kode tertanam, Anda akan menemukan log dalam hasil eksekusi. Saat Anda menggunakan fitur pengujian konsol untuk menjalankan fungsi, Anda akan menemukan Keluaran Log di bagian Detail.
Melihat log di CloudWatch konsol
Anda dapat menggunakan CloudWatch konsol Amazon untuk melihat log untuk semua pemanggilan fungsi Lambda.
Untuk melihat log di CloudWatch konsol
-
Buka halaman Grup log
di CloudWatch konsol. -
Pilih kelompok log untuk fungsi Anda (/aws/lambda/
your-function-name
). -
Pilih pengaliran log.
Setiap aliran log sesuai dengan instans fungsi Anda. Pengaliran log muncul saat Anda memperbarui fungsi Lambda dan saat instans tambahan dibuat untuk menangani beberapa invokasi bersamaan. Untuk menemukan log untuk pemanggilan tertentu, kami sarankan untuk menginstrumentasi fungsi Anda dengan. AWS X-Ray X-Ray mencatat detail tentang permintaan dan pengaliran log di jejak.
Melihat log menggunakan AWS Command Line Interface (AWS CLI)
AWS CLI Ini adalah alat sumber terbuka yang memungkinkan Anda berinteraksi dengan AWS layanan menggunakan perintah di shell baris perintah Anda. Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
Anda dapat menggunakan AWS CLI untuk mengambil log untuk invokasi menggunakan opsi perintah --log-type
. Respons berisi bidang LogResult
yang memuat hingga 4 KB log berkode base64 dari invokasi.
contoh mengambil ID log
Contoh berikut menunjukkan cara mengambil ID log dari LogResult
untuk fungsi bernama my-function
.
aws lambda invoke --function-name my-function out --log-type Tail
Anda akan melihat output berikut:
{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
contoh mendekode log
Pada prompt perintah yang sama, gunakan utilitas base64
untuk mendekodekan log. Contoh berikut menunjukkan cara mengambil log berkode base64 untuk 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
cli-binary-formatOpsi ini diperlukan jika Anda menggunakan AWS CLI versi 2. Untuk menjadikan ini pengaturan default, jalankanaws configure set cli-binary-format raw-in-base64-out
. Untuk informasi selengkapnya, lihat opsi baris perintah global yang AWS CLI didukung di Panduan AWS Command Line Interface Pengguna untuk Versi 2.
Anda akan melihat output berikut:
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
Utilitas base64
tersedia di Linux, macOS, dan Ubuntu pada Windowsbase64 -D
.
contoh Skrip get-logs.sh
Pada prompt perintah yang sama, gunakan script berikut untuk mengunduh lima peristiwa log terakhir. Skrip menggunakan sed
untuk menghapus kutipan dari file output, dan akan tidur selama 15 detik untuk memberikan waktu agar log tersedia. Output mencakup respons dari Lambda dan output dari perintah get-log-events
.
Salin konten dari contoh kode berikut dan simpan dalam direktori proyek Lambda Anda sebagai get-logs.sh
.
cli-binary-formatOpsi ini diperlukan jika Anda menggunakan AWS CLI versi 2. Untuk menjadikan ini pengaturan default, jalankanaws configure set cli-binary-format raw-in-base64-out
. Untuk informasi selengkapnya, lihat opsi baris perintah global yang AWS CLI didukung di Panduan AWS Command Line Interface Pengguna untuk Versi 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
contoh macOS dan Linux (khusus)
Pada prompt perintah yang sama, pengguna macOS dan Linux mungkin perlu menjalankan perintah berikut untuk memastikan skrip dapat dijalankan.
chmod -R 755 get-logs.sh
contoh mengambil lima log acara terakhir
Pada prompt perintah yang sama, gunakan skrip berikut untuk mendapatkan lima log acara terakhir.
./get-logs.sh
Anda akan melihat output berikut:
{ "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" }
Menghapus log
Grup log tidak terhapus secara otomatis ketika Anda menghapus suatu fungsi. Untuk menghindari penyimpanan log secara tidak terbatas, hapus kelompok log, atau lakukan konfigurasi periode penyimpanan, yang setelahnya log akan dihapus secara otomatis.
Kode pencatatan sampel
GitHub Repositori untuk panduan ini mencakup contoh aplikasi yang menunjukkan penggunaan berbagai konfigurasi logging. Setiap contoh aplikasi menyertakan skrip untuk penyebaran dan pembersihan yang mudah, AWS SAM templat, dan sumber daya pendukung.
Sampel aplikasi Lambda di Java
-
java17-examples
- Fungsi Java yang menunjukkan bagaimana menggunakan catatan Java untuk mewakili objek data peristiwa masukan. -
java-basic
- Kumpulan fungsi Java minimal dengan pengujian unit dan konfigurasi logging variabel. -
java-events
- Kumpulan fungsi Java yang berisi kode kerangka untuk cara menangani peristiwa dari berbagai layanan seperti Amazon GatewayAPI, Amazon, dan Amazon SQS Kinesis. Fungsi-fungsi ini menggunakan versi terbaru dari aws-lambda-java-eventsperpustakaan (3.0.0 dan yang lebih baru). Contoh-contoh ini tidak memerlukan ketergantungan AWS SDK sebagai. -
s3-java
— Fungsi Java yang memproses peristiwa notifikasi dari Amazon S3 dan menggunakan Java Class Library JCL () untuk membuat thumbnail dari file gambar yang diunggah. -
Gunakan API Gateway untuk menjalankan fungsi Lambda — Fungsi Java yang memindai tabel Amazon DynamoDB yang berisi informasi karyawan. Kemudian menggunakan Amazon Simple Notification Service untuk mengirim pesan teks kepada karyawan yang merayakan ulang tahun kerja mereka. Contoh ini menggunakan API Gateway untuk memanggil fungsi.
Aplikasi sampel java-basic
menunjukkan konfigurasi pencatatan minimal yang mendukung uji pencatatan. Kode handler menggunakan logger LambdaLogger
yang disediakan oleh objek konteks. Untuk pengujian, aplikasi menggunakan TestLogger
kelas khusus yang mengimplementasikan LambdaLogger
antarmuka dengan logger Log4j2. Ini digunakan SLF4J sebagai fasad untuk kompatibilitas dengan AWS SDK. Pustaka log masuk dikecualikan dari output pembuatan untuk menjaga paket deployment tetap kecil.