Skip to content

Commit 472a7b7

Browse files
committed
docs: logging
- Restructure page with clear section order: log methods, default log format, execution metadata, replay suppression, custom logger, configure logger, logger interface, and Powertools - Add per-language default log format examples with JSON output - Add execution metadata section with per-context field reference and per-language tabs for child context fields - Clarify replay suppression behaviour including retrying steps - Add Configure logger and Logger interface as separate sections - Add Powertools for AWS Lambda section with drop-in examples for all three languages - Fix opening paragraph to be language-neutral - Remove emdashes from list items Closes #37, Closes #73, Closes #55
1 parent facfab8 commit 472a7b7

20 files changed

Lines changed: 486 additions & 593 deletions

docs/sdk-reference/observability/logging.md

Lines changed: 232 additions & 593 deletions
Large diffs are not rendered by default.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import software.amazon.lambda.durable.DurableContext;
2+
import software.amazon.lambda.durable.DurableHandler;
3+
4+
public class BasicUsage extends DurableHandler<Object, String> {
5+
@Override
6+
public String handleRequest(Object event, DurableContext context) {
7+
context.getLogger().info("Starting workflow");
8+
9+
String result = context.step("process", String.class, stepCtx -> "done");
10+
11+
context.getLogger().info("Workflow complete: {}", result);
12+
return result;
13+
}
14+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import software.amazon.lambda.durable.DurableConfig;
2+
import software.amazon.lambda.durable.DurableContext;
3+
import software.amazon.lambda.durable.DurableHandler;
4+
import software.amazon.lambda.durable.logging.LoggerConfig;
5+
6+
public class CustomLogger extends DurableHandler<Object, Void> {
7+
8+
@Override
9+
protected DurableConfig createConfiguration() {
10+
// Allow logs during replay by overriding the default LoggerConfig.
11+
return DurableConfig.builder()
12+
.withLoggerConfig(LoggerConfig.withReplayLogging())
13+
.build();
14+
}
15+
16+
@Override
17+
public Void handleRequest(Object event, DurableContext context) {
18+
context.getLogger().info("Logs appear on every replay");
19+
return null;
20+
}
21+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import org.slf4j.Logger;
2+
import software.amazon.lambda.durable.logging.DurableLogger;
3+
4+
// DurableLogger wraps an SLF4J Logger and adds MDC entries:
5+
// durableExecutionArn, requestId, operationId, operationName, attempt
6+
//
7+
// Obtain it from any context:
8+
// DurableLogger logger = context.getLogger();
9+
// DurableLogger logger = stepContext.getLogger();
10+
//
11+
// Available methods:
12+
// logger.trace(String format, Object... args)
13+
// logger.debug(String format, Object... args)
14+
// logger.info(String format, Object... args)
15+
// logger.warn(String format, Object... args)
16+
// logger.error(String format, Object... args)
17+
// logger.error(String message, Throwable t)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import org.slf4j.Logger;
2+
import org.slf4j.LoggerFactory;
3+
import software.amazon.lambda.powertools.logging.Logging;
4+
import com.amazonaws.services.lambda.runtime.Context;
5+
import com.amazonaws.services.lambda.runtime.RequestHandler;
6+
7+
public class MyHandler implements RequestHandler<Object, String> {
8+
9+
private static final Logger logger = LoggerFactory.getLogger(MyHandler.class);
10+
11+
@Logging
12+
public String handleRequest(Object event, Context context) {
13+
logger.info("Running handler");
14+
return "ok";
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import software.amazon.lambda.durable.DurableContext;
2+
import software.amazon.lambda.durable.DurableHandler;
3+
4+
public class ReplaySuppression extends DurableHandler<Object, String> {
5+
@Override
6+
public String handleRequest(Object event, DurableContext context) {
7+
// context.getLogger() suppresses duplicate logs during replay by default.
8+
// Logs from completed operations do not repeat when the SDK replays.
9+
context.getLogger().info("Step 1 starting");
10+
11+
String result = context.step("step-1", String.class, stepCtx -> "result");
12+
13+
context.getLogger().info("Step 1 complete: {}", result);
14+
return result;
15+
}
16+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import software.amazon.lambda.durable.DurableContext;
2+
import software.amazon.lambda.durable.DurableHandler;
3+
import software.amazon.lambda.durable.StepContext;
4+
5+
public class StepContextLogger extends DurableHandler<Object, String> {
6+
@Override
7+
public String handleRequest(Object event, DurableContext context) {
8+
return context.step("process", String.class, (StepContext stepCtx) -> {
9+
// stepCtx.getLogger() includes operationId, operationName, and attempt in MDC.
10+
stepCtx.getLogger().info("Running step");
11+
return "done";
12+
});
13+
}
14+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from aws_durable_execution_sdk_python import DurableContext, durable_execution
2+
3+
4+
@durable_execution
5+
def handler(event: dict, context: DurableContext):
6+
context.logger.info("Starting workflow")
7+
8+
result = context.step(lambda ctx: "done")
9+
10+
context.logger.info("Workflow complete", extra={"result": result})
11+
return result
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from aws_lambda_powertools import Logger
2+
3+
from aws_durable_execution_sdk_python import DurableContext, durable_execution
4+
5+
powertools_logger = Logger(service="my-service")
6+
7+
8+
@durable_execution
9+
def handler(event: dict, context: DurableContext):
10+
context.set_logger(powertools_logger)
11+
context.logger.info("Using Powertools logger")
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from collections.abc import Mapping
2+
from typing import Protocol
3+
4+
5+
class LoggerInterface(Protocol):
6+
def debug(
7+
self, msg: object, *args: object, extra: Mapping[str, object] | None = None
8+
) -> None: ...
9+
10+
def info(
11+
self, msg: object, *args: object, extra: Mapping[str, object] | None = None
12+
) -> None: ...
13+
14+
def warning(
15+
self, msg: object, *args: object, extra: Mapping[str, object] | None = None
16+
) -> None: ...
17+
18+
def error(
19+
self, msg: object, *args: object, extra: Mapping[str, object] | None = None
20+
) -> None: ...
21+
22+
def exception(
23+
self, msg: object, *args: object, extra: Mapping[str, object] | None = None
24+
) -> None: ...

0 commit comments

Comments
 (0)