![]() |
VOOZH | about |
dotnet add package AwsLambda.Host.Envelopes.CloudWatchLogs --version 1.3.1
NuGet\Install-Package AwsLambda.Host.Envelopes.CloudWatchLogs -Version 1.3.1
<PackageReference Include="AwsLambda.Host.Envelopes.CloudWatchLogs" Version="1.3.1" />
<PackageVersion Include="AwsLambda.Host.Envelopes.CloudWatchLogs" Version="1.3.1" />Directory.Packages.props
<PackageReference Include="AwsLambda.Host.Envelopes.CloudWatchLogs" />Project file
paket add AwsLambda.Host.Envelopes.CloudWatchLogs --version 1.3.1
#r "nuget: AwsLambda.Host.Envelopes.CloudWatchLogs, 1.3.1"
#:package AwsLambda.Host.Envelopes.CloudWatchLogs@1.3.1
#addin nuget:?package=AwsLambda.Host.Envelopes.CloudWatchLogs&version=1.3.1Install as a Cake Addin
#tool nuget:?package=AwsLambda.Host.Envelopes.CloudWatchLogs&version=1.3.1Install as a Cake Tool
Strongly-typed CloudWatch Logs event handling for the AwsLambda.Host framework.
This package provides envelope classes that extend the base
CloudWatchLogsEvent
with automatic base64 decoding, decompression, and deserialization of CloudWatch Logs data.
Instead of manually decoding and decompressing data from Awslogs.Data, you access the
deserialized payload directly via envelope.AwslogsContent.
| Envelope Class | Base Class | Use Case |
|---|---|---|
CloudWatchLogsEnvelope |
CloudWatchLogsEvent |
CloudWatch Logs events with plain string log data |
CloudWatchLogsEnvelope<T> |
CloudWatchLogsEvent |
CloudWatch Logs events with typed deserialized data |
Define your log data type and handler:
using System.Text.Json;
using AwsLambda.Host.Builder;
using AwsLambda.Host.Envelopes.CloudWatchLogs;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
var builder = LambdaApplication.CreateBuilder();
builder.Services.ConfigureEnvelopeOptions(options =>
{
options.JsonOptions.PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower;
});
var lambda = builder.Build();
// CloudWatchLogsEnvelope<T> provides access to the CloudWatch Logs event with each log message
// deserialized into type T
lambda.MapHandler(
([Event] CloudWatchLogsEnvelope<Log> logs, ILogger<Program> logger) =>
{
foreach (var logEvent in logs.AwslogsContent!.LogEvents)
{
logger.LogInformation("Log level: {Level}", logEvent.MessageContent?.Level);
logger.LogInformation("Log message: {Message}", logEvent.MessageContent?.Message);
logger.LogInformation("Request ID: {RequestId}", logEvent.MessageContent?.RequestId);
}
}
);
await lambda.RunAsync();
public record Log(string Level, string Message, string RequestId);
If your log messages are plain strings (not JSON data), use CloudWatchLogsEnvelope instead of
CloudWatchLogsEnvelope<T> to avoid deserialization errors. CloudWatchLogsEnvelope sets each
MessageContent to the raw string message without attempting deserialization.
To implement custom deserialization logic, extend CloudWatchLogsEnvelopeBase<T>, override the
ExtractPayload method, and call base.ExtractPayload(options) to deserialize the CloudWatch Logs
envelope structure, then deserialize each log message:
// Example: Custom XML deserialization
public sealed class CloudWatchLogsXmlEnvelope<T> : CloudWatchLogsEnvelopeBase<T>
{
private static readonly XmlSerializer Serializer = new(typeof(T));
public override void ExtractPayload(EnvelopeOptions options)
{
base.ExtractPayload(options);
foreach (var logEvent in AwslogsContent!.LogEvents)
{
using var stringReader = new StringReader(logEvent.Message);
using var xmlReader = XmlReader.Create(stringReader, options.XmlReaderSettings);
logEvent.MessageContent = (T)Serializer.Deserialize(xmlReader)!;
}
}
}
This pattern allows you to support multiple serialization formats while maintaining the same envelope interface.
When using .NET Native AOT, register both the envelope and payload types in your
JsonSerializerContext:
[JsonSerializable(typeof(CloudWatchLogsEnvelope<LogData>))]
[JsonSerializable(typeof(LogData))]
internal partial class SerializerContext : JsonSerializerContext;
Register the serializer and configure envelope options to use the context:
builder.Services.AddLambdaSerializerWithContext<SerializerContext>();
builder.Services.ConfigureEnvelopeOptions(options =>
{
options.JsonOptions.TypeInfoResolver = SerializerContext.Default;
});
The context must be registered as the type resolver for both the envelope options and the Lambda serializer because the Lambda event and envelope payload are deserialized at different steps: the Lambda serializer deserializes the raw event, and the envelope options deserialize the envelope content into your payload type.
Additional packages in the aws-lambda-host framework for abstractions, observability, and event source handling.
This project is licensed under the MIT License. See for details.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|