Volkan,

Not frustrating at all, I'm coming into this without any real experience with 
how log4j approaches API design.

> Thinking naively: Assuming you already thought about it, why doesn't the 
> following work for you?
> 1. Cast the `LoggerContext` to `AsyncLoggerContext`
> 2. Reflectively extract the `AsyncLoggerContext#loggerDisruptor`
> 3. Reflectively extract the `AsyncLoggerDisruptor#asyncQueueFullPolicy`
> 4. Call `DiscardingAsyncQueueFullPolicy.getDiscardCount()` on the policy 
> instance

It's something we considered a last resort. I'm always hesitant to couple to a 
non-public API (such as reflecting into private fields), and doubly so when it 
is code I do not control.

-Adam


From: Volkan Yazıcı <vol...@yazi.ci>
Date: Thursday, April 11, 2024 at 4:09 AM
To: Adam Thomas <adamt...@amazon.com>
Cc: "dev@logging.apache.org" <dev@logging.apache.org>
Subject: RE: Monitoring discards from async logging


Hello Adam, 

I am very sorry for the frustrating experience. I can certainly see you do an 
excellent job in getting engaged with the project to get this feature request 
rolling. Thank you so much for that.

I read your conversation with Piotr and I get your point – yes, neither 
migration to Log4j 3 (which still has an unknown release date), nor augmenting 
the configuration is an option for you. I agree with your assessments there.

Thinking naively: Assuming you already thought about it, why doesn't the 
following work for you?
1. Cast the `LoggerContext` to `AsyncLoggerContext`
2. Reflectively extract the `AsyncLoggerContext#loggerDisruptor`
3. Reflectively extract the `AsyncLoggerDisruptor#asyncQueueFullPolicy`
4. Call `DiscardingAsyncQueueFullPolicy.getDiscardCount()` on the policy 
instance
Kind regards.

On Wed, Apr 10, 2024 at 12:11 AM Thomas, Adam <adamt...@amazon.com.invalid> 
wrote:
I created a pull request[1] late last year for this, and was encouraged to 
start a discussion on the dev list at the time.

We run log4j2 on a lot of hosts that are operated by different teams. By 
default, our users use async logging and use the Discard asyncQueueFullPolicy. 
As far as I can tell, the status logger gets one WARN message the first time an 
event is discarded, and during shutdown a TRACE message is emitted if any 
discards happened. This leaves us with essentially no insight as to whether or 
not events are actually being discarded, when they are being discarded, or how 
many we are discarding.

My pull request is pretty simple; the discarding policy already tracks 
discards, and I expose a getter for this counter from 
LoggerContext/AsyncLoggerContext. Polling the counter and pushing It to our 
telemetry system is an exercise left up to the user (me). I don’t have any real 
concerns about the safety of the change, but I have no idea how acceptable it 
is as a change to the API surface.

This also spawned a metrics proof-of-concept that was recently closed [2]. I’m 
fine with a more complete metrics solution, but I’m not sure of the timeline of 
such a solution, if any.

How can I move forward on this pull request to make it acceptable, or is there 
another way to accomplish this that would be more palatable?

-Adam

[1] https://github.com/apache/logging-log4j2/pull/1927
[2] https://github.com/apache/logging-log4j2/pull/1943

Reply via email to