Skip to content

Commit ec0b73a

Browse files
committed
add new LogLevelJsonConverter and remove generic JsonEnumConverter
1 parent 5eb8338 commit ec0b73a

File tree

5 files changed

+94
-8
lines changed

5 files changed

+94
-8
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Text.Json;
3+
using System.Text.Json.Serialization;
4+
using Microsoft.Extensions.Logging;
5+
6+
namespace AWS.Lambda.Powertools.Logging.Serializers;
7+
8+
internal class LogLevelJsonConverter : JsonConverter<LogLevel>
9+
{
10+
public override LogLevel Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
11+
{
12+
return Enum.TryParse<LogLevel>(reader.GetString(),true, out var val) ? val : default;
13+
}
14+
15+
public override void Write(Utf8JsonWriter writer, LogLevel value, JsonSerializerOptions options)
16+
{
17+
writer.WriteStringValue(value.ToString());
18+
}
19+
}

libraries/src/AWS.Lambda.Powertools.Logging/Serializers/PowertoolsLoggingSerializer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,9 @@ private static JsonSerializerOptions BuildJsonSerializerOptions()
153153
_jsonOptions.Converters.Add(new TimeOnlyConverter());
154154

155155
#if NET8_0_OR_GREATER
156-
_jsonOptions.Converters.Add(new JsonStringEnumConverter<LogLevel>());
156+
_jsonOptions.Converters.Add(new LogLevelJsonConverter());
157157
#elif NET6_0
158-
_jsonOptions.Converters.Add(new JsonStringEnumConverter());
158+
_jsonOptions.Converters.Add(new LogLevelJsonConverter());
159159
#endif
160160

161161
_jsonOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping;

libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Formatter/LogFormatterTest.cs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using System.Linq;
2020
using System.Reflection;
2121
using System.Text.Json;
22+
using System.Text.Json.Serialization;
2223
using Amazon.Lambda.Core;
2324
using Amazon.Lambda.TestUtilities;
2425
using AWS.Lambda.Powertools.Common;
@@ -42,7 +43,50 @@ public LogFormatterTest()
4243
{
4344
_testHandler = new TestHandlers();
4445
}
45-
46+
47+
[Fact]
48+
public void Serialize_ShouldHandleEnumValues()
49+
{
50+
var consoleOut = Substitute.For<StringWriter>();
51+
SystemWrapper.Instance.SetOut(consoleOut);
52+
var lambdaContext = new TestLambdaContext
53+
{
54+
FunctionName = "funtionName",
55+
FunctionVersion = "version",
56+
InvokedFunctionArn = "function::arn",
57+
AwsRequestId = "requestId",
58+
MemoryLimitInMB = 128
59+
};
60+
61+
var handler = new TestHandlers();
62+
handler.TestEnums("fake", lambdaContext);
63+
64+
consoleOut.Received(1).WriteLine(Arg.Is<string>(i =>
65+
i.Contains("\"message\":5")
66+
));
67+
consoleOut.Received(1).WriteLine(Arg.Is<string>(i =>
68+
i.Contains("\"message\":\"Dog\"")
69+
));
70+
71+
var json = JsonSerializer.Serialize(Pet.Dog, PowertoolsLoggingSerializer.GetSerializerOptions());
72+
Assert.Contains("Dog", json);
73+
}
74+
75+
[JsonConverter(typeof(JsonStringEnumConverter))]
76+
public enum Pet
77+
{
78+
Cat = 1,
79+
Dog = 3,
80+
Lizard = 5
81+
}
82+
83+
public enum Thing
84+
{
85+
One = 1,
86+
Three = 3,
87+
Five = 5
88+
}
89+
4690
[Fact]
4791
public void Log_WhenCustomFormatter_LogsCustomFormat()
4892
{
@@ -204,7 +248,7 @@ public void Should_Log_CustomFormatter_When_Decorated()
204248
consoleOut.Received(1).WriteLine(
205249
Arg.Is<string>(i =>
206250
i.Contains(
207-
"\"correlation_ids\":{\"aws_request_id\":\"requestId\"},\"lambda_function\":{\"name\":\"funtionName\",\"arn\":\"function::arn\",\"memory_limit_in_mb\":128,\"version\":\"version\",\"cold_start\":true},\"level\":\"Information\""))
251+
"\"correlation_ids\":{\"aws_request_id\":\"requestId\"},\"lambda_function\":{\"name\":\"funtionName\",\"arn\":\"function::arn\",\"memory_limit_in_mb\":128,\"version\":\"version\",\"cold_start\":true},\"level\":\"Information\""))
208252
);
209253
#else
210254
consoleOut.Received(1).WriteLine(

libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Handlers/TestHandlers.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* permissions and limitations under the License.
1414
*/
1515

16+
using System.Text.Json.Serialization;
1617
using Amazon.Lambda.APIGatewayEvents;
1718
using Amazon.Lambda.ApplicationLoadBalancerEvents;
1819
using Amazon.Lambda.CloudWatchEvents;
@@ -158,4 +159,26 @@ public void TestLogNoDecorator()
158159
{
159160
Logger.LogInformation("test");
160161
}
162+
163+
[Logging(Service = "test", LoggerOutputCase = LoggerOutputCase.SnakeCase)]
164+
public void TestEnums(string input, ILambdaContext context)
165+
{
166+
Logger.LogInformation(Pet.Dog);
167+
Logger.LogInformation(Thing.Five);
168+
}
169+
170+
public enum Thing
171+
{
172+
One = 1,
173+
Three = 3,
174+
Five = 5
175+
}
176+
177+
[JsonConverter(typeof(JsonStringEnumConverter))]
178+
public enum Pet
179+
{
180+
Cat = 1,
181+
Dog = 3,
182+
Lizard = 5
183+
}
161184
}

libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Serializers/PowertoolsLoggingSerializerTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ public void SerializerOptions_ShouldHaveCorrectDefaultSettings()
6262
converter => Assert.IsType<DateOnlyConverter>(converter),
6363
converter => Assert.IsType<TimeOnlyConverter>(converter),
6464
#if NET8_0_OR_GREATER
65-
converter => Assert.IsType<JsonStringEnumConverter<LogLevel>>(converter));
65+
converter => Assert.IsType<LogLevelJsonConverter>(converter));
6666
#elif NET6_0
67-
converter => Assert.IsType<JsonStringEnumConverter>(converter));
67+
converter => Assert.IsType<LogLevelJsonConverter>(converter));
6868
#endif
6969

7070
Assert.Equal(JavaScriptEncoder.UnsafeRelaxedJsonEscaping, options.Encoder);
@@ -90,9 +90,9 @@ public void SerializerOptions_ShouldHaveCorrectDefaultSettings_WhenDynamic()
9090
converter => Assert.IsType<DateOnlyConverter>(converter),
9191
converter => Assert.IsType<TimeOnlyConverter>(converter),
9292
#if NET8_0_OR_GREATER
93-
converter => Assert.IsType<JsonStringEnumConverter<LogLevel>>(converter));
93+
converter => Assert.IsType<LogLevelJsonConverter>(converter));
9494
#elif NET6_0
95-
converter => Assert.IsType<JsonStringEnumConverter>(converter));
95+
converter => Assert.IsType<LogLevelJsonConverter>(converter));
9696
#endif
9797

9898
Assert.Equal(JavaScriptEncoder.UnsafeRelaxedJsonEscaping, options.Encoder);

0 commit comments

Comments
 (0)