On Thu, May 9, 2013 at 3:39 PM, Nick Williams (JIRA) <[email protected]>wrote:
> > [ > https://issues.apache.org/jira/browse/LOG4J2-245?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13653088#comment-13653088] > > Nick Williams commented on LOG4J2-245: > -------------------------------------- > > Okay, I've done a little analysis. First, it appears that the goal here is > to include more information in the output stack trace than just: > > package.Class.method(File:line) > > It appears whoever wrote this actually wanted: > > package.Class.method(File:line) jar-or-dir:implementation-version > > Those last two bits you can't get from the StackTraceElement. Tangent: What about making those last two bits optional? You'd have to ask for them in your layout to get them. Gary > You can only get them from the Class. Since loading the Class from a > String isn't very efficient (read: is very slow), the goal was to use > getCallerClass (or the security manager) to get a stack of classes instead > of a stack of StackTraceElements. A cache was put in place to improve > things, but getCallerClass still makes it better. > > Now, if I have misunderstood anything here, please let me know, because > the rest of this might not be pertinent. Assuming I'm right... > > The first thing I noticed is that Throwable#getStackTrace() and > Reflection#getCallerClass(in loop) will not return the same stack! They > will have different classes, or classes out of order. The stacks will only > match up to a certain point, and then they will stop matching and you'll > revert to loading classes manually. Maybe this is okay and was understood, > but I'm not sure how much good it's doing. > > The second thing that caught my eyes was this: > > if (source != null) { > final URL locationURL = source.getLocation(); > if (locationURL != null) { > final String str = locationURL.toString().replace('\\', '/'); > int index = str.lastIndexOf("/"); > if (index >= 0 && index == str.length() - 1) { > index = str.lastIndexOf("/", index - 1); > location = str.substring(index + 1); > } else { > location = str.substring(index + 1); > } > } > } > > I think the performance of this can be improved (please check my syntax): > > if (source != null) { > final URL locationURL = source.getLocation(); > if (locationURL != null) { > // split without limit trims off empty parts, so no need to worry > about URL ending in slash > final String[] parts = locationURL.toString().split("(\\\\:\/)"); > location = parts[ parts.length - 1]; > } > } > > I believe that's an improvement. (I could be wrong; regular expressions > aren't always the answer.) > > By the way, I created this: > http://mail.openjdk.java.net/pipermail/java-se-8-spec-comments/2013-May/000014.html > > > EmptyStackException when logging error through JCL bridge > > --------------------------------------------------------- > > > > Key: LOG4J2-245 > > URL: https://issues.apache.org/jira/browse/LOG4J2-245 > > Project: Log4j 2 > > Issue Type: Bug > > Components: Core, JCL Bridge > > Affects Versions: 2.0-beta5, 2.0-beta6 > > Reporter: Nick Williams > > Priority: Blocker > > > > Possibly affects earlier versions, too, but I did not check. > > beta5 and beta6 are both unusable with Spring Framework. Any time an > error gets logged through log4j-jcl bridge using Spring, the error below > appears in the Tomcat log, masking the error that Spring was trying to log > and making it very difficult to figure out what happened. I've also > included my configuration file below the stack trace. The root error is > happening on Tomcat 6 due to Spring bug, and that root problem is > unimportant. The important problem is the Log4j error that masks it. > > SEVERE: Exception sending context initialized event to listener instance > of class org.springframework.web.context.ContextLoaderListener > > java.util.EmptyStackException > > at java.util.Stack.peek(Stack.java:102) > > at > org.apache.logging.log4j.core.impl.ThrowableProxy.resolvePackageData(ThrowableProxy.java:339) > > at > org.apache.logging.log4j.core.impl.ThrowableProxy.<init>(ThrowableProxy.java:71) > > at > org.apache.logging.log4j.core.impl.Log4jLogEvent.<init>(Log4jLogEvent.java:110) > > at > org.apache.logging.log4j.core.impl.Log4jLogEvent.<init>(Log4jLogEvent.java:81) > > at > org.apache.logging.log4j.core.config.LoggerConfig.createEvent(LoggerConfig.java:423) > > at > org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:344) > > at org.apache.logging.log4j.core.Logger.log(Logger.java:110) > > at > org.apache.logging.log4j.spi.AbstractLoggerWrapper.log(AbstractLoggerWrapper.java:55) > > at > org.apache.logging.log4j.spi.AbstractLogger.error(AbstractLogger.java:539) > > at > org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:319) > > at > org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) > > at > org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4765) > > at > org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5210) > > at > org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) > > at > org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726) > > at > org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702) > > at > org.apache.catalina.core.StandardHost.addChild(StandardHost.java:698) > > at > org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1491) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > at java.lang.reflect.Method.invoke(Method.java:491) > > at > org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) > > at > com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) > > at > com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:792) > > at > org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:468) > > at > org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:415) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > at java.lang.reflect.Method.invoke(Method.java:491) > > at > org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) > > at > com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) > > at > com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:792) > > at > javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1465) > > at > javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:75) > > at > javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1306) > > at > javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1398) > > at > javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:827) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > at java.lang.reflect.Method.invoke(Method.java:491) > > at > sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) > > at sun.rmi.transport.Transport$1.run(Transport.java:177) > > at sun.rmi.transport.Transport$1.run(Transport.java:174) > > at java.security.AccessController.doPrivileged(Native Method) > > at sun.rmi.transport.Transport.serviceCall(Transport.java:173) > > at > sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556) > > at > sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811) > > at > sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670) > > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) > > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) > > at java.lang.Thread.run(Thread.java:724) > > <?xml version="1.0" encoding="UTF-8"?> > > <configuration status="WARN"> > > <appenders> > > <Console name="Console" target="SYSTEM_OUT"> > > <PatternLayout > > pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} > - %msg%n"/> > > </Console> > > <RollingFile name="WroxFileAppender" > fileName="../logs/application.log" > > > filePattern="../logs/application-%d{MM-dd-yyyy}-%i.log"> > > <PatternLayout> > > <pattern>%d{HH:mm:ss.SSS} [%t] %X{id} %X{username} > %-5level %c{36} %l: %msg%n</pattern> > > </PatternLayout> > > <Policies> > > <SizeBasedTriggeringPolicy size="10 MB" /> > > </Policies> > > <DefaultRolloverStrategy min="1" max="4" /> > > </RollingFile> > > </appenders> > > <loggers> > > <root level="warn"> > > <appender-ref ref="Console" /> > > <appender-ref ref="WroxFileAppender" /> > > </root> > > <logger name="com.wrox" level="info" /> > > <logger name="org.apache" level="info" /> > > <logger name="org.springframework" level="info" /> > > </loggers> > > </configuration> > > -- > This message is automatically generated by JIRA. > If you think it was sent incorrectly, please contact your JIRA > administrators > For more information on JIRA, see: http://www.atlassian.com/software/jira > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > > -- E-Mail: [email protected] | [email protected] Java Persistence with Hibernate, Second Edition<http://www.manning.com/bauer3/> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> Spring Batch in Action <http://www.manning.com/templier/> Blog: http://garygregory.wordpress.com Home: http://garygregory.com/ Tweet! http://twitter.com/GaryGregory
