Skip to content

Commit 01dbd30

Browse files
docs: Modern way of configuring json layout via JsonTemplateLayout
1 parent d04932e commit 01dbd30

File tree

2 files changed

+100
-3
lines changed

2 files changed

+100
-3
lines changed

docs/core/logging.md

+99-3
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,23 @@ Logging provides an opinionated logger with output structured as JSON.
1313

1414
## Initialization
1515

16-
Powertools extends the functionality of Log4J. Below is an example `#!xml log4j2.xml` file, with the `#!java LambdaJsonLayout` configured.
16+
Powertools extends the functionality of Log4J. Below is an example `#!xml log4j2.xml` file, with the `JsonTemplateLayout` using `#!json LambdaJsonLayout.json` configured.
17+
18+
!!! info "LambdaJsonLayout is now deprecated"
19+
20+
Configuring utiltiy using `<LambdaJsonLayout/>` plugin is deprecated now. While utility still supports the old configuration, we strongly recommend upgrading the
21+
`log4j2.xml` configuration to `JsonTemplateLayout` instead. [JsonTemplateLayout](https://logging.apache.org/log4j/2.x/manual/json-template-layout.html) is recommended way of doing structured logging.
22+
23+
Please follow [this guide](#upgrade-to-jsontemplatelayout-from-deprecated-lambdajsonlayout-configuration-in-log4j2xml) for upgrade steps.
1724

1825
=== "log4j2.xml"
1926

2027
```xml hl_lines="5"
2128
<?xml version="1.0" encoding="UTF-8"?>
22-
<Configuration packages="com.amazonaws.services.lambda.runtime.log4j2">
29+
<Configuration>
2330
<Appenders>
2431
<Console name="JsonAppender" target="SYSTEM_OUT">
25-
<LambdaJsonLayout compact="true" eventEol="true"/>
32+
<JsonTemplateLayout eventTemplateUri="classpath:LambdaJsonLayout.json" />
2633
</Console>
2734
</Appenders>
2835
<Loggers>
@@ -123,6 +130,44 @@ to customise what is logged.
123130
}
124131
```
125132

133+
### Customising fields in logs
134+
135+
- Utility by default emits `timestamp` field in the logs in format `yyyy-MM-dd'T'HH:mm:ss.SSSZz` and in system default timezone.
136+
If you need to customize format and timezone, you can do so by configuring `log4j2.component.properties` and configuring properties as shown in example below:
137+
138+
=== "log4j2.component.properties"
139+
140+
```properties hl_lines="1 2"
141+
log4j.layout.jsonTemplate.timestampFormatPattern=yyyy-MM-dd'T'HH:mm:ss.SSSZz
142+
log4j.layout.jsonTemplate.timeZone=Europe/Oslo
143+
```
144+
145+
- Utility also provides sample template for [Elastic Common Schema(ECS)](https://www.elastic.co/guide/en/ecs/current/ecs-reference.html) layout.
146+
The filed emitted in logs will follow specs from [ECS](https://www.elastic.co/guide/en/ecs/current/ecs-reference.html) together with field captured by utility as mentioned [above](#standard-structured-keys).
147+
148+
Use `LambdaEcsLayout.json` as `eventTemplateUri` when configuring `JsonTemplateLayout`.
149+
150+
=== "log4j2.xml"
151+
152+
```xml hl_lines="5"
153+
<?xml version="1.0" encoding="UTF-8"?>
154+
<Configuration>
155+
<Appenders>
156+
<Console name="JsonAppender" target="SYSTEM_OUT">
157+
<JsonTemplateLayout eventTemplateUri="classpath:LambdaEcsLayout.json" />
158+
</Console>
159+
</Appenders>
160+
<Loggers>
161+
<Logger name="JsonLogger" level="INFO" additivity="false">
162+
<AppenderRef ref="JsonAppender"/>
163+
</Logger>
164+
<Root level="info">
165+
<AppenderRef ref="JsonAppender"/>
166+
</Root>
167+
</Loggers>
168+
</Configuration>
169+
```
170+
126171
## Setting a Correlation ID
127172

128173
You can set a Correlation ID using `correlationIdPath` attribute by passing a [JSON Pointer expression](https://datatracker.ietf.org/doc/html/draft-ietf-appsawg-json-pointer-03){target="_blank"}.
@@ -417,3 +462,54 @@ via `samplingRate` attribute on annotation.
417462
Variables:
418463
POWERTOOLS_LOGGER_SAMPLE_RATE: 0.5
419464
```
465+
466+
467+
## Upgrade to JsonTemplateLayout from deprecated LambdaJsonLayout configuration in log4j2.xml
468+
469+
Prior to version [1.10.0](https://github.com/awslabs/aws-lambda-powertools-java/releases/tag/v1.10.0), only supported way of configuring `log4j2.xml` was via `<LambdaJsonLayout/>`. This plugin is
470+
deprecated now and will be removed in future version. Switching to `JsonTemplateLayout` is straight forward.
471+
472+
Below examples shows deprecated and new configuration of `log4j2.xml`.
473+
474+
=== "Deprecated configuration of log4j2.xml"
475+
476+
```xml hl_lines="5"
477+
<?xml version="1.0" encoding="UTF-8"?>
478+
<Configuration>
479+
<Appenders>
480+
<Console name="JsonAppender" target="SYSTEM_OUT">
481+
<LambdaJsonLayout compact="true" eventEol="true"/>
482+
</Console>
483+
</Appenders>
484+
<Loggers>
485+
<Logger name="JsonLogger" level="INFO" additivity="false">
486+
<AppenderRef ref="JsonAppender"/>
487+
</Logger>
488+
<Root level="info">
489+
<AppenderRef ref="JsonAppender"/>
490+
</Root>
491+
</Loggers>
492+
</Configuration>
493+
```
494+
495+
=== "New configuration of log4j2.xml"
496+
497+
```xml hl_lines="5"
498+
<?xml version="1.0" encoding="UTF-8"?>
499+
<Configuration>
500+
<Appenders>
501+
<Console name="JsonAppender" target="SYSTEM_OUT">
502+
<JsonTemplateLayout eventTemplateUri="classpath:LambdaJsonLayout.json" />
503+
</Console>
504+
</Appenders>
505+
<Loggers>
506+
<Logger name="JsonLogger" level="INFO" additivity="false">
507+
<AppenderRef ref="JsonAppender"/>
508+
</Logger>
509+
<Root level="info">
510+
<AppenderRef ref="JsonAppender"/>
511+
</Root>
512+
</Loggers>
513+
</Configuration>
514+
```
515+

powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaJsonLayout.java

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
/***
4747
* Note: The LambdaJsonLayout should be considered to be deprecated. Please use JsonTemplateLayout instead.
4848
*/
49+
@Deprecated
4950
@Plugin(name = "LambdaJsonLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
5051
public final class LambdaJsonLayout extends AbstractJacksonLayoutCopy {
5152
private static final String DEFAULT_FOOTER = "]";

0 commit comments

Comments
 (0)