[ 
https://issues.apache.org/jira/browse/LOG4J2-2696?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17083130#comment-17083130
 ] 

Guoqiang Jiang commented on LOG4J2-2696:
----------------------------------------

+1. Any plan here?

> Class loading for extended stack traces causes performance issues
> -----------------------------------------------------------------
>
>                 Key: LOG4J2-2696
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-2696
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.11.2
>            Reporter: Joe Jordan
>            Priority: Major
>
> Extended stack traces invoke class loading, including for classes such as 
> "jdk/internal/reflect/GeneratedMethodAccessor183.class".
>  
> When running  e.g. springboot+Tomcat with a fat-jar, this class loading is 
> delegated to TomcatEmbeddedWebappClassLoader, which will unzip JAR files in 
> an attempt to find the class.  This causes performance issues, as JAR files 
> are unzipped every time an exception with one of these classes in the stack 
> is logged.
> In the case of TomcatEmbeddedWebappClassLoader, there is a caching mechanism 
> in place but this particular code path bypasses the cache, due to the 
> filename pattern being searched for (starts-with "/WEB-INF/classes", 
> ends-with ".class").
> Others have also noticed performance issues here, due to locking in Jetty's 
> classloader: 
> [https://stackoverflow.com/questions/53627883/how-to-stop-log4j2-load-class-in-exception-stack]
>  
> Example stack trace:
> {noformat}
>    java.lang.Thread.State: RUNNABLE
>       at java.util.zip.Inflater.inflateBytesBytes([email protected]/Native 
> Method)
>       at java.util.zip.Inflater.inflate([email protected]/Inflater.java:385)
>       - locked <0x00000000c337ca78> (a 
> java.util.zip.Inflater$InflaterZStreamRef)
>       at 
> java.util.zip.InflaterInputStream.read([email protected]/InflaterInputStream.java:153)
>       at 
> java.util.zip.ZipInputStream.read([email protected]/ZipInputStream.java:195)
>       at 
> java.util.jar.JarInputStream.read([email protected]/JarInputStream.java:207)
>       at 
> java.util.zip.ZipInputStream.closeEntry([email protected]/ZipInputStream.java:141)
>       at 
> java.util.zip.ZipInputStream.getNextEntry([email protected]/ZipInputStream.java:119)
>       at 
> java.util.jar.JarInputStream.getNextEntry([email protected]/JarInputStream.java:142)
>       at 
> java.util.jar.JarInputStream.getNextJarEntry([email protected]/JarInputStream.java:179)
>       at 
> org.apache.catalina.webresources.JarWarResourceSet.getArchiveEntries(JarWarResourceSet.java:117)
>       - locked <0x00000000d6fc7d00> (a java.lang.Object)
>       at 
> org.apache.catalina.webresources.AbstractArchiveResourceSet.getResource(AbstractArchiveResourceSet.java:253)
>       at 
> org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:282)
>       at org.apache.catalina.webresources.Cache.getResource(Cache.java:62)
>       at 
> org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:217)
>       at 
> org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(StandardRoot.java:226)
>       at 
> org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2303)
>       at 
> org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:865)
>       at 
> org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.findClassIgnoringNotFound(TomcatEmbeddedWebappClassLoader.java:119)
>       at 
> org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.doLoadClass(TomcatEmbeddedWebappClassLoader.java:84)
>       at 
> org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.loadClass(TomcatEmbeddedWebappClassLoader.java:66)
>       - locked <0x00000000d9741ce8> (a java.lang.Object)
>       at 
> org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
>       at 
> org.apache.logging.log4j.util.LoaderUtil.loadClass(LoaderUtil.java:166)
>       at 
> org.apache.logging.log4j.core.impl.ThrowableProxyHelper.loadClass(ThrowableProxyHelper.java:218)
>       at 
> org.apache.logging.log4j.core.impl.ThrowableProxyHelper.toExtendedStackTrace(ThrowableProxyHelper.java:114)
>       at 
> org.apache.logging.log4j.core.impl.ThrowableProxy.<init>(ThrowableProxy.java:109)
>       at 
> org.apache.logging.log4j.core.impl.ThrowableProxy.<init>(ThrowableProxy.java:93)
>       at 
> org.apache.logging.log4j.core.impl.Log4jLogEvent.getThrownProxy(Log4jLogEvent.java:605)
>       at 
> org.apache.logging.log4j.core.impl.Log4jLogEvent.serialize(Log4jLogEvent.java:718)
>       at 
> org.apache.logging.log4j.core.impl.Log4jLogEvent.createMemento(Log4jLogEvent.java:772)
>       at 
> org.apache.logging.log4j.core.appender.AsyncAppender.append(AsyncAppender.java:162)
>       at 
> org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
>       at 
> org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
>       at 
> org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
>       at 
> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:464)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:448)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:431)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.logParent(LoggerConfig.java:455)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:450)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:431)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:406)
>       at 
> org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
>       at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:146)
>       at 
> org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2170)
>       at 
> org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2125)
>       at 
> org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2108)
>       at 
> org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2002)
>       at 
> org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1974)
>       at 
> org.apache.logging.slf4j.Log4jLogger.error(Log4jLogger.java:319){noformat}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to