Lisa, I am replying on list for others benefit but won’t include any details 
about your application.

Lisa provided me with 3 snapshots: one running in Java 8, one running in Java 
11 with %logger{36}, and one in Java 11 without it.

First, the snapshots don’t show Log4j to be the main area of overhead but I am 
going to ignore that.

I am noticing some differences between the snapshots
In Java 8 the Log4j processing is about 420 ms. In Java 11 without %logger{36} 
it is about 875 ms and in Java 11 with %logger{36} the processing time is about 
1,800 ms (1.8 seconds).
A significant portion of that time is spent performing file I/O. In Java 11 
with %logger{36} it is spending 1,609 ms in java.io 
<http://java.io/>.FileOutputStream.writeBytes. I checked the source for that 
and it is a native method so it is unlikely anything in Log4j is called after 
that.
I noticed the same pattern in the other 2 snapshots - the majority of the 
elapsed time is spent in the writeBytes method.
In the Java 8 snapshot I don’t see any overhead in the RollingFileAppender. Was 
it disabled for that snapshot? 
Based on the call and time used patterns I can tell that 
AbstractOutputStreamAppender.directEncodeEvent is being called. For some reason 
that doesn’t take whether buffered I/O was requested into account and it seems 
it will flush on every call since immediateFlush defaults to true.
I don’t seem any significant time being spent in any of the pattern converters, 
including the logger.
While I believe I see both console logging and the rolling file appender in the 
Java 11 snapshots from what I can tell it is writing to the console that is 
causing the problem. This would agree with what you reported in your initial 
email.

I suspect what is going on here is that every log event is resulting in a 
write. I suspect that when the logger name is included the line is simply 
becoming longer and makes the writes noticeably slower. 

As an aside I noticed you specified %logger{36}. That seems odd to me as it 
means you are expecting logger names with up to 36 dots in them. Were you 
really meaning to do something else?

At this point I would try a couple of things:
Replace %logger{36} with a string with a length that matches a typical logger 
name and see if that has the same result. If it does then that would support my 
hypothesis.
Don’t log to the console. Our tests have shown that even in Java 8 it is up to 
40 times slower than writing to a file.

You could try writing a custom version of the ConsoleAppender that sets 
immediateFlush to false but I have never tested that and have no idea if it 
will help.

None of this really explains why the calls to write the same message to the 
console in Java 11 is so much slower than in Java 8 but from what I am seeing 
the problem seems to be in java.io <http://java.io/> or something it is calling.


Ralph

Reply via email to