Skip to content

Commit 9c45f3f

Browse files
committed
feat(logging/logback): update docs, align logback with log4j implementation
1 parent bff7b3a commit 9c45f3f

File tree

6 files changed

+24
-30
lines changed

6 files changed

+24
-30
lines changed

docs/core/logging.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -378,9 +378,17 @@ You can use Powertools for AWS Lambda Logging with either the `@Logging` annotat
378378
}
379379
```
380380

381-
???+ warning "SLF4J Fluent Logging API"
382-
When using [SLF4J Fluent Logging API](https://www.slf4j.org/manual.html#fluent) **do not add reserved keys** listed in [standard structured keys](#standard-structured-keys) and [additional structured keys](#additional-structured-keys) as key-value pairs via `addKeyValue`.
383-
This may cause unindented behavior.
381+
???+ warning "Do not reuse reserved keys"
382+
383+
Do not reuse reserved keys listed in [standard structured keys](#standard-structured-keys) and [additional structured keys](#additional-structured-keys).
384+
This restriction applies to all structured logging mechanisms, including:
385+
386+
- Log arguments
387+
- MDC entries
388+
- `addKeyValue(...)` or `addArgument(...)` of [SLF4J Fluent Logging API](https://www.slf4j.org/manual.html#fluent)
389+
- Any other structured data fields
390+
391+
Reusing reserved keys in any of these contexts may result in unintended or inconsistent behavior.
384392

385393
## Standard structured keys
386394

powertools-logging/powertools-logging-logback/src/main/java/software/amazon/lambda/powertools/logging/logback/JsonUtils.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,6 @@ static void serializeMDCEntry(Map.Entry<String, String> entry, JsonSerializer se
7373
}
7474
}
7575

76-
static void serializeKVPEntry(String key, Object value, JsonSerializer serializer) {
77-
serializer.writeRaw(',');
78-
serializer.writeFieldName(key);
79-
serializer.writeObject(value);
80-
}
81-
8276
static void serializeArguments(ILoggingEvent event, JsonSerializer serializer) throws IOException {
8377
Object[] arguments = event.getArgumentArray();
8478
if (arguments != null) {

powertools-logging/powertools-logging-logback/src/main/java/software/amazon/lambda/powertools/logging/logback/LambdaEcsEncoder.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ public byte[] headerBytes() {
9898
@SuppressWarnings("java:S106")
9999
@Override
100100
public byte[] encode(ILoggingEvent event) {
101-
final Map<String, String> mdcPropertyMap = event.getMDCPropertyMap();
101+
final Map<String, String> mdcPropertyMap = new TreeMap<>(event.getMDCPropertyMap());
102+
mdcPropertyMap.putAll(getKeyValuePairs(event));
102103

103104
StringBuilder builder = new StringBuilder();
104105
try (JsonSerializer serializer = new JsonSerializer(builder)) {
@@ -131,8 +132,6 @@ public byte[] encode(ILoggingEvent event) {
131132

132133
serializeMDCEntries(mdcPropertyMap, serializer);
133134

134-
serializeKeyValuePairs(event, serializer);
135-
136135
serializeArguments(event, serializer);
137136

138137
serializer.writeEndObject();
@@ -143,14 +142,11 @@ public byte[] encode(ILoggingEvent event) {
143142
return builder.toString().getBytes(UTF_8);
144143
}
145144

146-
private void serializeKeyValuePairs(ILoggingEvent event, JsonSerializer serializer) {
147-
Optional.ofNullable(event.getKeyValuePairs())
145+
private Map<String, String> getKeyValuePairs(ILoggingEvent event) {
146+
return Optional.ofNullable(event.getKeyValuePairs())
148147
.orElse(Collections.emptyList()).stream()
149148
.filter(Objects::nonNull)
150-
.map(kvp -> new AbstractMap.SimpleEntry<>(String.valueOf(kvp.key), kvp.value))
151-
.filter(kvp -> !PowertoolsLoggedFields.stringValues().contains(kvp.getKey()))
152-
.sorted(Map.Entry.comparingByKey())
153-
.forEach(kvp -> serializeKVPEntry(kvp.getKey(), kvp.getValue(), serializer));
149+
.collect(TreeMap::new, (map, kvp) -> map.put(String.valueOf(kvp.key), String.valueOf(kvp.value)), TreeMap::putAll);
154150
}
155151

156152
private void serializeFunctionInfo(JsonSerializer serializer, String arn, Map<String, String> mdcPropertyMap) {

powertools-logging/powertools-logging-logback/src/main/java/software/amazon/lambda/powertools/logging/logback/LambdaJsonEncoder.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,11 @@ public byte[] encode(ILoggingEvent event) {
7979
serializeException(event, serializer);
8080

8181
TreeMap<String, String> sortedMap = new TreeMap<>(event.getMDCPropertyMap());
82+
sortedMap.putAll(getKeyValuePairs(event));
8283
serializePowertools(sortedMap, serializer);
8384

8485
serializeMDCEntries(sortedMap, serializer);
8586

86-
serializeKeyValuePairs(event, serializer);
87-
8887
serializeArguments(event, serializer);
8988

9089
serializeThreadInfo(event, serializer);
@@ -101,14 +100,11 @@ public byte[] encode(ILoggingEvent event) {
101100
return builder.toString().getBytes(UTF_8);
102101
}
103102

104-
private void serializeKeyValuePairs(ILoggingEvent event, JsonSerializer serializer) {
105-
Optional.ofNullable(event.getKeyValuePairs())
103+
private Map<String, String> getKeyValuePairs(ILoggingEvent event) {
104+
return Optional.ofNullable(event.getKeyValuePairs())
106105
.orElse(Collections.emptyList()).stream()
107106
.filter(Objects::nonNull)
108-
.map(kvp -> new AbstractMap.SimpleEntry<>(String.valueOf(kvp.key), kvp.value))
109-
.filter(kvp -> !PowertoolsLoggedFields.stringValues().contains(kvp.getKey()))
110-
.sorted(Map.Entry.comparingByKey())
111-
.forEach(kvp -> serializeKVPEntry(kvp.getKey(), kvp.getValue(), serializer));
107+
.collect(TreeMap::new, (map, kvp) -> map.put(String.valueOf(kvp.key), String.valueOf(kvp.value)), TreeMap::putAll);
112108
}
113109

114110
private void serializeThreadInfo(ILoggingEvent event, JsonSerializer serializer) {

powertools-logging/powertools-logging-logback/src/test/java/software/amazon/lambda/powertools/logging/internal/LambdaEcsEncoderTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ void shouldLogKeyValuePairs() {
188188
LambdaEcsEncoder encoder = new LambdaEcsEncoder();
189189
encoder.start();
190190

191-
LoggingEvent keyValuePairsLoggingEvent = new LoggingEvent("fqcn", logger, Level.INFO, "Key Value Pairs Test with argument: {}",
191+
LoggingEvent keyValuePairsLoggingEvent = new LoggingEvent("fqcn", logger, Level.INFO, "Key Value Pairs Test",
192192
null, new Object[0]);
193193

194194
keyValuePairsLoggingEvent.setKeyValuePairs(List.of(
@@ -211,7 +211,7 @@ void shouldLogKeyValuePairs() {
211211
.contains("\"key_01_string\":\"value_01\"")
212212
.contains("\"key_02_numeric\":2")
213213
.contains("\"key_03_decimal\":2.333")
214-
.contains("\"key_04_null\":null")
214+
.contains("\"key_04_null\":\"null\"")
215215
.contains("\"\":\"value_05_empty_key\"")
216216
.contains("\"null\":\"value_06_null_key\"")
217217
.contains("\"key_07_boolean_true\":true")

powertools-logging/powertools-logging-logback/src/test/java/software/amazon/lambda/powertools/logging/internal/LambdaJsonEncoderTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ void shouldLogKeyValuePairs() {
450450
LambdaJsonEncoder encoder = new LambdaJsonEncoder();
451451
encoder.start();
452452

453-
LoggingEvent keyValuePairsLoggingEvent = new LoggingEvent("fqcn", logger, Level.INFO, "Key Value Pairs Test with argument: {}",
453+
LoggingEvent keyValuePairsLoggingEvent = new LoggingEvent("fqcn", logger, Level.INFO, "Key Value Pairs Test",
454454
null, new Object[0]);
455455

456456
keyValuePairsLoggingEvent.setKeyValuePairs(List.of(
@@ -473,7 +473,7 @@ void shouldLogKeyValuePairs() {
473473
.contains("\"key_01_string\":\"value_01\"")
474474
.contains("\"key_02_numeric\":2")
475475
.contains("\"key_03_decimal\":2.333")
476-
.contains("\"key_04_null\":null")
476+
.contains("\"key_04_null\":\"null\"")
477477
.contains("\"\":\"value_05_empty_key\"")
478478
.contains("\"null\":\"value_06_null_key\"")
479479
.contains("\"key_07_boolean_true\":true")

0 commit comments

Comments
 (0)