https://docs.micrometer.io/context-propagation/reference/

This is more in line with what I was thinking we should support. I’m not 
suggesting that we add Micrometer as a dependency to the API or Core, but we 
can replicate the minimal API here or figure out a smaller API for integration 
purposes.

Note that similar projects like the OpenTelemetry context propagation API is 
geared toward cross-process context propagation, not cross-thread or similar 
lower level primitives. The low level primitives belong in Log4j IMO.


> On Mar 27, 2024, at 16:56, Ralph Goers <ralph.go...@dslextreme.com> wrote:
> 
> Volkan,
> 
> No more hand waving. Please see 
> https://github.com/apache/logging-log4j2/pull/2419.
> 
> I should note that while implementing the classes I added to support this 
> makes it easier I did not have to make any changes to the logging internals 
> to make this work.
> 
> Ralph
> 
>> On Mar 22, 2024, at 1:45 AM, Volkan Yazıcı <vol...@yazi.ci> wrote:
>> 
>> No, it is not the same thing Matt. Let me be as explicit as I can:
>> 
>> var logger0 = getLogger();  // MDC: {}
>> var logger1 = logger0.withContextData("x", 1);  // MDC: {x: 1}
>> var logger2 = logger1.withContextData("y", 2);  // MDC: {x: 1, y: 2}
>> 
>> This is the functionality being requested. Whoever claims this can be done 
>> using a `MessageFactory`, they need to share a working [pseudo] code, 
>> instead of hand waving. So far, nobody responded to this. Piotr, speculated 
>> on a non-existing `Logger#withMessageFactory(MessageFactory)`, but there is 
>> not one single working example shared. Hence, unless you can prove me wrong 
>> with a working practical[1] example, the requested feature is currently 
>> known to be not practically possible in Log4j.
>> 
>> [1] Implementing `logger.withContextData("x", 1)` with 50 LoC Java code 
>> using the existing Log4j feature set is not a "practical example".
>> 
>> P.S. For Log4j 3 API Javadocs, you can browse to 
>> https://logging.apache.org/log4j/3.x and search for "Javadoc" in the menu. 
>> (Obviously, same works for Log4j 2 too.)
>> 
>> On Thu, Mar 21, 2024 at 6:10 PM Matt Sicker <m...@musigma.org> wrote:
>> LogManager - log4j-api 3.0.0-alpha1 javadoc
>> javadoc.io
>> 
>> Pass your custom MessageFactory here. It’s an optional argument when 
>> creating the Logger.
>> 
>> Also, I’m not sure where to even find the current javadocs for the API. 
>> javadoc.io only seems to have this alpha release.
>> 
>> 
>>> On Mar 21, 2024, at 04:34, Volkan Yazıcı <vol...@yazi.ci> wrote:
>>> 
>>> Ralph, could you show how those two users can use a `MessageFactory` to
>>> create `Logger`s with predefined additional context data?
>>> 
>>> On Thu, Mar 21, 2024 at 7:25 AM Ralph Goers <rgo...@apache.org> wrote:
>>> 
>>>> Unfortunately this is another message I somehow didn't get in my inbox.
>>>> Replying to it via lists.a.o is not a great experience but is the best I
>>>> can do.
>>>> 
>>>> On 2024/03/20 13:51:56 Volkan Yazıcı wrote:
>>>>> I agree with the way Piotr dissects the problem. I think `ScopedContext`,
>>>>> even though it has its own merits, doesn't address the problem reported
>>>> by
>>>>> users. They simply want a new logger associated with some additional
>>>>> context data.
>>>> 
>>>> Two users do.  I have personally been asked for something like
>>>> ScopedContext several times.
>>>> As I replied to Piotr, we already solved the problem of adding data to
>>>> Loggers. That is what MessageFactories are intended for.
>>>> 
>>>>> 
>>>>> *[See my comments below.]*
>>>>> 
>>>>> On Mon, Mar 18, 2024 at 10:40 AM Piotr P. Karwasz <
>>>> piotr.karw...@gmail.com>
>>>>> wrote:
>>>>> 
>>>>>> * we can create a `Logger` wrapper "bound" to context data as Mikko
>>>>>> does. This wrapper will take care of setting the `ThreadContext`
>>>>>> before the logger call and restore it after it.
>>>>> 
>>>>> Creating a wrapper `Logger` can work without needing to deal with
>>>>> `ThreadContext`. I can think of two different ways to carry this out:
>>>>> 
>>>>>  1. Currently, `AbstractLogger` only creates `Message`s. We can rework
>>>> it
>>>>>  to create `LogEvent`s too. Once `AbstractLogger` gets its hand on a
>>>>>  `LogEvent`, it can enrich its context data as it wishes.
>>>>>  2. We can extend `ContextDataInjector` with a new `void
>>>>>  injectContextData(Logger logger, StringMap target)` method, provide a
>>>>>  `ContextDataInjector` implementation that branches on `logger
>>>> instanceof
>>>>>  ContextDataProvider`, and call `ContextDataInjector` with the
>>>> associated
>>>>>  `Logger` in `LogEventFactory`.
>>>> 
>>>> We can do lots of things, most of which I wouldn't recommend. As to yours:
>>>> 1. Logger/AbstractLogger got very complex with Async, Garbage Free,
>>>> Reliablity Strategies, etc. Trying to move creating the LogEvent sooner is
>>>> likely to be a major PITA and could seriously impact performance. While we
>>>> could add a context map to AbstractLogger we would have to pass that on the
>>>> logging calls to LoggerConfig and deal with all that that means - remember,
>>>> a LoggerConfig can be handling multiple Loggers.
>>>> 2. I don't recommend extending ContextDataInjector. That proved difficult
>>>> to work with which is why we now recommend using ContextDataProviders. You
>>>> really can only have one ContextDataInjector. Also, please note that
>>>> ContextDataInjector is called while constructing the LogEvent. The LogEvent
>>>> isn't passed the Logger, only the LoggerName. Looking up the Logger to do
>>>> this is yet another way to slow down logging.
>>>> 
>>>>> 
>>>>> On Tue, Mar 19, 2024 at 7:45 AM Ralph Goers <ralph.go...@dslextreme.com>
>>>>> wrote:
>>>>>> In the meantime, I provided
>>>>> https://github.com/apache/logging-log4j2/pull/2385 which I very loosely
>>>>> modeled after ScopedValues.
>>>>> 
>>>>> The fact that `ScopedContext` tries to imitate `ScopedValue` using
>>>>> `ThreadLocal`s is extremely confusing (from a user's pov) and risky
>>>>> liability (from a maintainer's pov). I guess you wanted to implement *a*
>>>>> `ScopedValue` without using *the* `ScopedValue` to be compatible with
>>>> Java
>>>>> 8. If so, that really sounds like the `o.a.l.log4j.util.Supplier`
>>>> downward
>>>>> spiral. We can rather have an *internal* `Log4jScopedValue` interface and
>>>>> provide Java 8 (using `InheritableThreadLocal`) and Java 21+ (using
>>>>> `ScopedValue`) compatible solutions in an MRJ (Multi-Release JAR).
>>>> 
>>>> I am NOT trying to make ScopedContext compatible with ScopedValue. I am
>>>> trying to make it conceptually close enough to ScopedValue that users will
>>>> understand what it is doing.
>>>> We can argue about naming if you want. Gary has already expressed his
>>>> opinion.
>>>>> 
>>>>> We can integrate `ScopedContext` to the `LogEventFactory` by providing a
>>>>> specialized `ContextDataInjector` plugin – assuming `LogEventFactory`
>>>>> employs all available `ContextDataInjector` plugins.
>>>> 
>>>> ScopedContext is integrated with a ContextDataProvider, which is the
>>>> supported way to do this. Again, you cannot have more than one
>>>> ContextDataInjector so providing "specialized versions" is a pipe dream.
>>>> You will simply have to enhance the one we already have.
>>>> ContextDataInjector is NOT a plugin.
>>>> 
>>>>> 
>>>>> I find the current ceremony also too long:
>>>>> `ScopedContext.getCurrent().where("key1", "value1").run(...)`. I would
>>>>> rather aim for `ScopedContext.run(key, value, runnable)` and similar
>>>>> `ScopedContext.op(..., runnable)` interaction.
>>>> 
>>>> Those are going to be provided as well.
>>>> 
>>>> Ralph
>>>> 
>> 
> 

Reply via email to