[
https://issues.apache.org/jira/browse/LOG4J2-1010?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15345743#comment-15345743
]
Remko Popma commented on LOG4J2-1010:
-------------------------------------
I'm trying to understand the use case better... The original request mentioned
Twitter Finacle. I understand this is a heavily asynchronous services framework
where Futures play a central role. Application code has no control over which
threads execute the request so if you want to have some shared information in
all logging statements resulting from the same request, storing this
information in a ThreadLocal will not work. I was wondering how other people
solve this. Surely we are not the first to run into this problem...
It turns out that Finacle has a concept called a
[Context|http://twitter.github.io/finagle/guide/Contexts.html]:
{quote}
Finagle uses
[Contexts|https://github.com/twitter/finagle/blob/master/finagle-core/src/main/scala/com/twitter/finagle/context/Contexts.scala],
which give you something akin to Java’s ThreadLocals across asynchronous code.
They give you access to request-scoped state, such as a request’s deadline,
throughout the logical life of a request without requiring them to be
explicitly passed. Finagle explicitly manages them for you across threads and
execution contexts such as Future composition, FuturePools, Timers, and in some
cases — across the client/server boundary.
{quote}
If this is for the Scala module, then one way would be for the Scala module to
provide a Context-based mechanism to hold some request-scoped data and make it
visible to all log events in the same way that ThreadContext does in
log4j-core. In log4j-core, the ThreadContext information is merged into the
LogEvent when the LogEvent is initialized. This is currently hard-coded to take
the [LoggerConfig
properties|https://github.com/apache/logging-log4j2/blob/master/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java#L332]
(interpolated every time a log event is created), and merge these with the
Map<String, String> returned by ThreadContext.getImmutableContext(). One idea
would be to make this mechanism pluggable so that the Scala module can take
information from the Scala Context instead of the ThreadContext.
Another way would be for the application to do this manually on every logging
call. The application would need to store this information in some data
structure (let's say a map) and explicitly pass this data between threads and
execution contexts. Then every time the application logs something it would
pass this data as one of the arguments to the logging call. It seems to me that
this would put a fairly large burden on the application, but if I understand
correctly, this last mechanism is what Mikael is shooting for. Unless I
misunderstand...
> Possibility to set ThreadContext values in calls to Logger method
> -----------------------------------------------------------------
>
> Key: LOG4J2-1010
> URL: https://issues.apache.org/jira/browse/LOG4J2-1010
> Project: Log4j 2
> Issue Type: Improvement
> Components: API
> Affects Versions: 2.2
> Reporter: Mikael Ståldal
> Attachments: properties.patch
>
>
> It would be useful to have some logging methods in the Logger interface to
> set ThreadContext values for a single log message only.
> In an asynchronous environment, using ThreadContext as currently defined is
> not so useful since JVM threads might not be coupled to the logical flow of
> the application.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]