apache / apache/logging-log4j2

Add support for event context lookup evaluation in the `NoSql` appender

Open
#2,766 8 comments 1 reaction 0 assignees View on GitHub
appenders:MongoDB
Dominant language
Java
Stars
3.6k
Forks
1.7k
Avg merge
21h 30m
Merged PRs (30d)
27

Description

## Description

I want to use ConfigurationBuilder to config a NoSqlAppender, but I can`t set additionalFields, My code is:
``` java
MongoDb4Provider mongoDb4Provider = MongoDb4Provider.newBuilder()
.setConnectionStringSource("mongodb://localhost:27017/log.test")
.build();
NoSqlAppender mongoDbAppenderBuilder = NoSqlAppender.newBuilder()
.setName("MongoDbAppender")
.setProvider(mongoDb4Provider)
.build()
```
I lookup the source code, and I find NoSqlAppender.Builder class has a private field called "additionalFields", but is has not setter method;

So I use java reflect to set the value, My code is:
``` java
MongoDb4Provider mongoDb4Provider = MongoDb4Provider.newBuilder()
.setConnectionStringSource("mongodb://localhost:27017/log.test")
.build();
NoSqlAppender.Builder mongoDbAppenderBuilder = NoSqlAppender.newBuilder()
.setName("MongoDbAppender")
.setProvider(mongoDb4Provider)
.setConfiguration(config);
ReflectUtil.setFieldValue(mongoDbAppenderBuilder, "additionalFields", new KeyValuePair[] {
KeyValuePair.newBuilder().setKey("some_key").setValue("${map:some_key}").build(),
});
NoSqlAppender mongoDbAppender = mongoDbAppenderBuilder.build();
```
It works. But Map Lookup doesn`t work, My do log code is:
``` java
logger.info(new MapMessage(Map.of("some_key", "some_value")));
```
I expect ${map:some_key} can be resolved to some_value, but I get ${map:some_key} in MongoDB`s field. I tried ${map:some_key} $${map:some_key} %K{some_key} %map{some_key} %MAP{some_key} and none of them worked;

## Configuration

**Version:** 2.23.1

**Operating system:** Windows 11

**JDK:** JDK-17-oracle

Forgive my poor English, English is not my native language.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with NoSqlAppender.Builder and its additionalFields handling, then trace MapMessage event context through the MongoDb4Provider path. Reproduce the ConfigurationBuilder example and verify that ${map:some_key} resolves to some_value in the stored MongoDB field; done when the builder accepts the fields and event-context lookup works.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, mongodb
Domain
backend, observability-sre
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.