From ee2abb5852f2bb7a9089f89a17b4e7f725d94b53 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 14 Aug 2024 10:16:24 +0000 Subject: [PATCH 1/5] docs(logger): add logEventIfEnabled() docs --- docs/core/logger.md | 38 +++++++++++++++---- examples/snippets/logger/eventMiddy.ts | 16 -------- ...eventDecorator.ts => logEventDecorator.ts} | 7 ++-- examples/snippets/logger/logEventManual.ts | 9 +++++ examples/snippets/logger/logEventMiddy.ts | 11 ++++++ .../logger/samples/logEventInput.json | 3 ++ .../logger/samples/logEventOutput.json | 16 ++++++++ packages/logger/src/Logger.ts | 21 ++++++++-- 8 files changed, 89 insertions(+), 32 deletions(-) delete mode 100644 examples/snippets/logger/eventMiddy.ts rename examples/snippets/logger/{eventDecorator.ts => logEventDecorator.ts} (60%) create mode 100644 examples/snippets/logger/logEventManual.ts create mode 100644 examples/snippets/logger/logEventMiddy.ts create mode 100644 examples/snippets/logger/samples/logEventInput.json create mode 100644 examples/snippets/logger/samples/logEventOutput.json diff --git a/docs/core/logger.md b/docs/core/logger.md index ffce457122..47b0775be2 100644 --- a/docs/core/logger.md +++ b/docs/core/logger.md @@ -160,26 +160,48 @@ In each case, the printed log will look like this: ### Log incoming event -When debugging in non-production environments, you can instruct Logger to log the incoming event with the middleware/decorator parameter `logEvent`. +When debugging in non-production environments, you can log the incoming event using the `logEventIfEnabled()` method or by setting the `logEvent` option in the `injectLambdaContext()` Middy.js middleware or class method decorator. ???+ warning This is disabled by default to prevent sensitive info being logged -=== "Middy Middleware" +=== "`logEventIfEnabled()`" + + ```typescript hl_lines="1 7" + --8<-- "examples/snippets/logger/logEventManual.ts" + ``` + + 1. You can control the event logging via the `POWERTOOLS_LOGGER_LOG_EVENT` environment variable. - ```typescript hl_lines="15" - --8<-- "examples/snippets/logger/eventMiddy.ts" +=== "Middy.js Middleware" + + ```typescript hl_lines="10" + --8<-- "examples/snippets/logger/logEventMiddy.ts" ``` + 1. The `logEvent` option takes precedence over the `POWERTOOLS_LOGGER_LOG_EVENT` environment variable. + === "Decorator" - ```typescript hl_lines="8" - --8<-- "examples/snippets/logger/eventDecorator.ts" + ```typescript hl_lines="7" + --8<-- "examples/snippets/logger/logEventDecorator.ts" ``` - 1. Binding your handler method allows your handler to access `this` within the class methods. + 1. The `logEvent` option takes precedence over the `POWERTOOLS_LOGGER_LOG_EVENT` environment variable. + +=== "payload.json" + + ```json + --8<-- "examples/snippets/logger/samples/logEventInput.json" + ``` + +=== "CloudWatch output" + + ```json hl_lines="8 13-15" + --8<-- "examples/snippets/logger/samples/logEventOutput.json" + ``` -Use `POWERTOOLS_LOGGER_LOG_EVENT` environment variable to enable or disable (`true`/`false`) this feature. +Use `POWERTOOLS_LOGGER_LOG_EVENT` environment variable to enable or disable (`true`/`false`) this feature. When using Middy.js middleware or class method decorator, the `logEvent` option will take precedence over the environment variable. ### Appending additional keys diff --git a/examples/snippets/logger/eventMiddy.ts b/examples/snippets/logger/eventMiddy.ts deleted file mode 100644 index 3c3a40596b..0000000000 --- a/examples/snippets/logger/eventMiddy.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Logger } from '@aws-lambda-powertools/logger'; -import { injectLambdaContext } from '@aws-lambda-powertools/logger/middleware'; -import middy from '@middy/core'; - -const logger = new Logger(); - -const lambdaHandler = async ( - _event: unknown, - _context: unknown -): Promise => { - logger.info('This is an INFO log with some context'); -}; - -export const handler = middy(lambdaHandler).use( - injectLambdaContext(logger, { logEvent: true }) -); diff --git a/examples/snippets/logger/eventDecorator.ts b/examples/snippets/logger/logEventDecorator.ts similarity index 60% rename from examples/snippets/logger/eventDecorator.ts rename to examples/snippets/logger/logEventDecorator.ts index ab8feae23a..c8fc0b8daf 100644 --- a/examples/snippets/logger/eventDecorator.ts +++ b/examples/snippets/logger/logEventDecorator.ts @@ -4,12 +4,11 @@ import { Logger } from '@aws-lambda-powertools/logger'; const logger = new Logger(); class Lambda implements LambdaInterface { - // Set the log event flag to true - @logger.injectLambdaContext({ logEvent: true }) + @logger.injectLambdaContext({ logEvent: true }) // (1) public async handler(_event: unknown, _context: unknown): Promise { - logger.info('This is an INFO log with some context'); + // ... your lambda handler } } const myFunction = new Lambda(); -export const handler = myFunction.handler.bind(myFunction); // (1) +export const handler = myFunction.handler.bind(myFunction); diff --git a/examples/snippets/logger/logEventManual.ts b/examples/snippets/logger/logEventManual.ts new file mode 100644 index 0000000000..28930599ad --- /dev/null +++ b/examples/snippets/logger/logEventManual.ts @@ -0,0 +1,9 @@ +process.env.POWERTOOLS_LOG_EVENT = 'true'; + +import { Logger } from '@aws-lambda-powertools/logger'; +const logger = new Logger(); + +export const handler = async (event: unknown) => { + logger.logEventIfEnabled(event); // (1) + // ... your handler code +}; diff --git a/examples/snippets/logger/logEventMiddy.ts b/examples/snippets/logger/logEventMiddy.ts new file mode 100644 index 0000000000..5bc987074d --- /dev/null +++ b/examples/snippets/logger/logEventMiddy.ts @@ -0,0 +1,11 @@ +import { Logger } from '@aws-lambda-powertools/logger'; +import { injectLambdaContext } from '@aws-lambda-powertools/logger/middleware'; +import middy from '@middy/core'; + +const logger = new Logger(); + +export const handler = middy(async () => { + // ... your lambda handler +}).use( + injectLambdaContext(logger, { logEvent: true }) // (1) +); diff --git a/examples/snippets/logger/samples/logEventInput.json b/examples/snippets/logger/samples/logEventInput.json new file mode 100644 index 0000000000..b42f309e7a --- /dev/null +++ b/examples/snippets/logger/samples/logEventInput.json @@ -0,0 +1,3 @@ +{ + "foo": "bar" +} \ No newline at end of file diff --git a/examples/snippets/logger/samples/logEventOutput.json b/examples/snippets/logger/samples/logEventOutput.json new file mode 100644 index 0000000000..31c76da475 --- /dev/null +++ b/examples/snippets/logger/samples/logEventOutput.json @@ -0,0 +1,16 @@ +{ + "cold_start": true, + "function_arn": "arn:aws:lambda:eu-west-1:123456789012:function:LogEventFn", + "function_memory_size": "128", + "function_name": "LogEventFn", + "function_request_id": "0a9df60d-e2de-447d-ba3e-45f149eae6c9", + "level": "INFO", + "message": "Lambda invocation event", + "sampling_rate": 0, + "service": "service_undefined", + "timestamp": "2024-08-14T10:08:06.199Z", + "xray_trace_id": "1-66bc8205-21f8b5190da519d22b2b0533", + "event": { + "foo": "bar" + } +} \ No newline at end of file diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index 9bdf1e6f10..9d175c14fb 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -497,11 +497,24 @@ class Logger extends Utility implements LoggerInterface { } /** - * Logs a Lambda invocation event, if it *should*. + * Log the AWS Lambda event payload for the current invocation if the environment variable `POWERTOOLS_LOG_EVENT` is set to `true`. * - ** @param {unknown} event - * @param {boolean} [overwriteValue] - * @returns {void} + * @example + * ```ts + * process.env.POWERTOOLS_LOG_EVENT = 'true'; + * + * import { Logger } from '@aws-lambda-powertools/logger'; + * + * const logger = new Logger(); + * + * export const handler = async (event) => { + * logger.logEventIfEnabled(event); + * // ... your handler code + * } + * ``` + * + * @param {unknown} event - The AWS Lambda event payload. + * @param {boolean} overwriteValue - Overwrite the environment variable value. */ public logEventIfEnabled(event: unknown, overwriteValue?: boolean): void { if (!this.shouldLogEvent(overwriteValue)) return; From 66bec07704bd84511af4054eea64d8a1082c1b2e Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 14 Aug 2024 10:33:56 +0000 Subject: [PATCH 2/5] docs(logger): update env variable --- docs/core/logger.md | 2 +- examples/snippets/logger/logEventManual.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/core/logger.md b/docs/core/logger.md index 47b0775be2..a0965faea6 100644 --- a/docs/core/logger.md +++ b/docs/core/logger.md @@ -167,7 +167,7 @@ When debugging in non-production environments, you can log the incoming event us === "`logEventIfEnabled()`" - ```typescript hl_lines="1 7" + ```typescript hl_lines="1 8" --8<-- "examples/snippets/logger/logEventManual.ts" ``` diff --git a/examples/snippets/logger/logEventManual.ts b/examples/snippets/logger/logEventManual.ts index 28930599ad..1a196cec95 100644 --- a/examples/snippets/logger/logEventManual.ts +++ b/examples/snippets/logger/logEventManual.ts @@ -1,6 +1,7 @@ -process.env.POWERTOOLS_LOG_EVENT = 'true'; +process.env.POWERTOOLS_LOGGER_LOG_EVENT = 'true'; import { Logger } from '@aws-lambda-powertools/logger'; + const logger = new Logger(); export const handler = async (event: unknown) => { From bffd6d71e19d2a11893d27837dc107f5d7e0d154 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 16 Aug 2024 12:13:31 +0200 Subject: [PATCH 3/5] Update examples/snippets/logger/logEventDecorator.ts Co-authored-by: Leandro Damascena --- examples/snippets/logger/logEventDecorator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/snippets/logger/logEventDecorator.ts b/examples/snippets/logger/logEventDecorator.ts index c8fc0b8daf..8e5e325ed7 100644 --- a/examples/snippets/logger/logEventDecorator.ts +++ b/examples/snippets/logger/logEventDecorator.ts @@ -6,7 +6,7 @@ const logger = new Logger(); class Lambda implements LambdaInterface { @logger.injectLambdaContext({ logEvent: true }) // (1) public async handler(_event: unknown, _context: unknown): Promise { - // ... your lambda handler + // ... your logic here } } From 515709826610a189cf537114f41c5525d6d162ff Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 16 Aug 2024 12:13:43 +0200 Subject: [PATCH 4/5] Update examples/snippets/logger/logEventMiddy.ts Co-authored-by: Leandro Damascena --- examples/snippets/logger/logEventMiddy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/snippets/logger/logEventMiddy.ts b/examples/snippets/logger/logEventMiddy.ts index 5bc987074d..2263868a53 100644 --- a/examples/snippets/logger/logEventMiddy.ts +++ b/examples/snippets/logger/logEventMiddy.ts @@ -5,7 +5,7 @@ import middy from '@middy/core'; const logger = new Logger(); export const handler = middy(async () => { - // ... your lambda handler + // ... your logic here }).use( injectLambdaContext(logger, { logEvent: true }) // (1) ); From 1e1327f27da858437f24594f54fdc10057d11527 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 16 Aug 2024 12:13:51 +0200 Subject: [PATCH 5/5] Update examples/snippets/logger/logEventManual.ts Co-authored-by: Leandro Damascena --- examples/snippets/logger/logEventManual.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/snippets/logger/logEventManual.ts b/examples/snippets/logger/logEventManual.ts index 1a196cec95..76c0d3a941 100644 --- a/examples/snippets/logger/logEventManual.ts +++ b/examples/snippets/logger/logEventManual.ts @@ -6,5 +6,5 @@ const logger = new Logger(); export const handler = async (event: unknown) => { logger.logEventIfEnabled(event); // (1) - // ... your handler code + // ... your logic here };