2016-03-21 10:06 GMT+01:00 Cristiano Costantini < [email protected]>:
> I've tested deleting the endorsed Jar on different clean installations of > Karaf and ServiceMix, > > I never get question marks [?:?] on the logs using the log:display command, > although some line in the printed stack trace does not include bundle > information. > Right. The behaviour I pasted earlier was on karaf master branch (so with pax logging / log4j v2). The pax logging / log4j v1 does not print anything when the information is not available. > > Here you can check what I've done and what has been logged out > https://gist.github.com/cristcost/4a5c554ccbb9577c690e > > > I'm going to repeat the tests with the endorsed Exception for comparing the > logs. > > Cristiano > > > Il giorno lun 21 mar 2016 alle ore 09:42 Cristiano Costantini < > [email protected]> ha scritto: > > > mmmm > > > > now it is getting very weird... > > intrigued by the test with the protected method I have made another test: > > I have fully deleted the org.apache.karaf.exception-2.4.0.jar file from > the > > endorsed folder. > > And surprisingly, I still get the same logs information with the > > log:display command ! > > > > Please note that I am making this series of tests on ServiceMix 5.3.0, > > which is based on Karaf 2.4.0. > > This is the output of the test you have suggested: > > > > karaf@root> log:clear > > karaf@root> install foo > > Bundle IDs: > > Error executing command: Error installing bundles: > > Unable to install bundle foo > > karaf@root> log:display > > 2016-03-21 09:38:02,339 | ERROR | l Console Thread | Console > > | ? ? | 20 - > > org.apache.karaf.shell.console - 2.4.0 | Exception caught while executing > > command > > org.apache.karaf.shell.console.MultiException: Error installing bundles: > > Unable to install bundle foo > > at > > > org.apache.karaf.shell.console.MultiException.throwIf(MultiException.java:91) > > at > > > org.apache.karaf.shell.osgi.InstallBundle.doExecute(InstallBundle.java:70) > > at > > > org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:38)[20:org.apache.karaf.shell.console:2.4.0] > > at > > > org.apache.felix.gogo.commands.basic.AbstractCommand.execute(AbstractCommand.java:35)[20:org.apache.karaf.shell.console:2.4.0] > > at > > > org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)[20:org.apache.karaf.shell.console:2.4.0] > > at > > > org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477)[20:org.apache.karaf.shell.console:2.4.0] > > at > > > org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403)[20:org.apache.karaf.shell.console:2.4.0] > > at > > > org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)[20:org.apache.karaf.shell.console:2.4.0] > > at > > > org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)[20:org.apache.karaf.shell.console:2.4.0] > > at > > > org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)[20:org.apache.karaf.shell.console:2.4.0] > > at > > > org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:92)[20:org.apache.karaf.shell.console:2.4.0] > > at > > > org.apache.karaf.shell.console.jline.Console.run(Console.java:196)[20:org.apache.karaf.shell.console:2.4.0] > > at > > > org.apache.karaf.shell.console.jline.DelayedStarted.run(DelayedStarted.java:79)[20:org.apache.karaf.shell.console:2.4.0] > > Caused by: java.lang.Exception: Unable to install bundle foo > > at > > > org.apache.karaf.shell.osgi.InstallBundle.doExecute(InstallBundle.java:45) > > ... 11 more > > Caused by: org.osgi.framework.BundleException: Unable to cache bundle: > foo > > at org.apache.felix.framework.Felix.installBundle(Felix.java:2878) > > at > > > org.apache.felix.framework.BundleContextImpl.installBundle(BundleContextImpl.java:165) > > at > > > org.apache.karaf.shell.osgi.InstallBundle.doExecute(InstallBundle.java:43) > > ... 11 more > > Caused by: java.net.MalformedURLException: no protocol: foo > > at java.net.URL.<init>(URL.java:586)[:1.8.0_60] > > at > > > org.apache.felix.framework.util.SecureAction.createURL(SecureAction.java:254) > > at > > > org.apache.felix.framework.cache.JarRevision.initialize(JarRevision.java:148) > > at > org.apache.felix.framework.cache.JarRevision.<init>(JarRevision.java:77) > > at > > > org.apache.felix.framework.cache.BundleArchive.createRevisionFromLocation(BundleArchive.java:878) > > at > > > org.apache.felix.framework.cache.BundleArchive.reviseInternal(BundleArchive.java:550) > > at > > > org.apache.felix.framework.cache.BundleArchive.<init>(BundleArchive.java:153) > > at > > org.apache.felix.framework.cache.BundleCache.create(BundleCache.java:277) > > at org.apache.felix.framework.Felix.installBundle(Felix.java:2874) > > ... 13 more > > > > karaf@root> > > > > > > I repeat that this output is given from a Servicemix 5.3.0 where I have > > deleted the endorsed Jar. > > Do you expected this kind of logs Guillaume? > > > > I'll now make more tests with fully clean ServiceMix and fully clean > Karaf > > and let you know if the behavior persist. > > > > Cristiano > > > > > > > > > > > > Il giorno lun 21 mar 2016 alle ore 09:30 Guillaume Nodet < > > [email protected]> ha scritto: > > > >> 2016-03-21 9:13 GMT+01:00 Cristiano Costantini < > >> [email protected]>: > >> > >> > Hi all, > >> > > >> > Guillaume, could it be that pax logging works also if using > "protected" > >> in > >> > the getClassContext method? > >> > >> > >> > In fact I'm testing and comparing the two options, but I see that also > >> with > >> > the solution of making the endorsed class method like this: > >> > protected Class[] getClassContext() { > >> > return classContext; > >> > } > >> > > >> > I am still getting the same logs > >> > with [bundleId:bundleSymbolicName:bundleVersion] information > >> > > >> > > >> > > >> I don't. Try with > >> > bundle:install foo > >> > log:display > >> I end up with lots of ~[?:?] instead of the actual bundle informations > >> when using a protected method. > >> If the @XmlTransient annotation is sufficient, that's the easiest fix. > >> But I agree it would be better to move that method as protected. We > could > >> release a bug version of pax-logging to support this change. > >> > >> > >> > > >> > > >> > Il giorno dom 20 mar 2016 alle ore 09:24 Jean-Baptiste Onofré < > >> > [email protected]> ha scritto: > >> > > >> > > +1 > >> > > > >> > > I think @XmlTransient is sufficient and limit the impacts. > >> > > > >> > > Regards > >> > > JB > >> > > > >> > > On 03/20/2016 09:17 AM, Cristiano Costantini wrote: > >> > > > Hello all, > >> > > > > >> > > > I like the idea of having "bundle id, symbolic name and version" > in > >> the > >> > > > exception logs, I've used it a lot and I think we should find a > >> > solution > >> > > > that is as clean as possible and works well by keep this enhanced > >> > logging > >> > > > capability alive. > >> > > > > >> > > > The solution of marking the method with @XmlTransient is good and > >> would > >> > > > fully solve the CXF problem (I'll try this one tomorrow morning > and > >> > give > >> > > > you a confirmation about this approach). > >> > > > > >> > > > Also, JaxB sees it as a property because it is a getter, and try > to > >> > > > marshall it because JaxB default behavior is to marshall > properties. > >> > > > Then I propose also, for cleanliness to @Deprecate the > >> getClassContext > >> > > > method and create a new one called in a non property way, for > >> example > >> > > > simply classContext(), without the get. > >> > > > > >> > > > If Guillaume in pax-logging is using reflection and may be able to > >> > access > >> > > > the method even if it is protected, then it should be "protected", > >> > again > >> > > > for cleanliness. > >> > > > > >> > > > > >> > > > I was thinking at what other problems could be caused by this > >> > endorsement > >> > > > of the class: > >> > > > the underlying classContext field is correctly marked as > transient, > >> so > >> > I > >> > > > expect no problem due to serialization, even with third party > >> libraries > >> > > > (for example Kryo) which respect the transient modifier. > >> > > > Except for JaxB, I don't know any other use case where exceptions > >> may > >> > be > >> > > > accessed with reflection in search for methods. > >> > > > > >> > > > So to summarize: > >> > > > > >> > > > @XmlTransient @Deprecated public getClassContext() { ... } > >> > > > + > >> > > > protected classContext() { ... } > >> > > > > >> > > > seems to me the best option. > >> > > > > >> > > > > >> > > > What do you think? > >> > > > > >> > > > Cristiano > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > Il giorno dom 20 mar 2016 alle ore 04:04 Matt Sicker < > >> [email protected] > >> > > > >> > > ha > >> > > > scritto: > >> > > > > >> > > >> If there's a way to fix this in log4j, that would be better. > >> > > >> > >> > > >> On 19 March 2016 at 06:02, James Carman < > >> [email protected]> > >> > > >> wrote: > >> > > >> > >> > > >>> That's kind of a nasty trick just to get pretty stack traces. > Is > >> > this > >> > > >>> really necessary? > >> > > >>> > >> > > >>> On Fri, Mar 18, 2016 at 3:05 PM Guillaume Nodet < > >> [email protected]> > >> > > >> wrote: > >> > > >>> > >> > > >>>> I wrote that years ago and nobody complained about it, until > >> > today.... > >> > > >>>> Adding the @XmlTransient should be a good and quick fix. > >> > > >>>> > >> > > >>>> The benefit of the custom Exception is that this information is > >> > stored > >> > > >>>> along with the exception. This information is always lost when > >> you > >> > > need > >> > > >>> it > >> > > >>>> to render the exception, as the stack trace may be completely > >> > > different > >> > > >>> and > >> > > >>>> even in a from different thread, which mean you loose the > >> > information. > >> > > >> So > >> > > >>>> ReflectionUtil.getCurrentStackTrace() works the same, but the > >> > > >> information > >> > > >>>> is the one of the calling code, not the one of the exception, > and > >> > > >> that's > >> > > >>>> useless. > >> > > >>>> > >> > > >>>> If you look at a stack trace in Karaf, it looks like the > >> following: > >> > > >>>> > >> > > >>>> org.apache.karaf.shell.support.MultiException: Error installing > >> > > >> bundles: > >> > > >>>> > >> > > >>>> Unable to install bundle foo > >> > > >>>> > >> > > >>>> at > >> > > >>>> > >> > > >>>> > >> > > >>> > >> > > >> > >> > > > >> > > >> > org.apache.karaf.shell.support.MultiException.throwIf(MultiException.java:61) > >> > > >>>> ~[28:org.apache.karaf.shell.core:4.1.0.SNAPSHOT] > >> > > >>>> > >> > > >>>> at > >> org.apache.karaf.bundle.command.Install.execute(Install.java:113) > >> > > >>>> [12:org.apache.karaf.bundle.core:4.1.0.SNAPSHOT] > >> > > >>>> > >> > > >>>> at > >> > > >>>> > >> > > >>>> > >> > > >>> > >> > > >> > >> > > > >> > > >> > org.apache.karaf.shell.impl.action.command.ActionCommand.execute(ActionCommand.java:84) > >> > > >>>> [28:org.apache.karaf.shell.core:4.1.0.SNAPSHOT] > >> > > >>>> > >> > > >>>> at > >> > > >>>> > >> > > >>>> > >> > > >>> > >> > > >> > >> > > > >> > > >> > org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.execute(SecuredCommand.java:67) > >> > > >>>> [28:org.apache.karaf.shell.core:4.1.0.SNAPSHOT] > >> > > >>>> > >> > > >>>> at > >> > > >>>> > >> > > >>>> > >> > > >>> > >> > > >> > >> > > > >> > > >> > org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.execute(SecuredCommand.java:87) > >> > > >>>> [28:org.apache.karaf.shell.core:4.1.0.SNAPSHOT] > >> > > >>>> > >> > > >>>> at > >> > org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:548) > >> > > >>>> [28:org.apache.karaf.shell.core:4.1.0.SNAPSHOT] > >> > > >>>> > >> > > >>>> at > >> > > >>> > >> > > > >> org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:474) > >> > > >>>> [28:org.apache.karaf.shell.core:4.1.0.SNAPSHOT] > >> > > >>>> > >> > > >>>> at > >> org.apache.felix.gogo.runtime.Closure.execute(Closure.java:363) > >> > > >>>> [28:org.apache.karaf.shell.core:4.1.0.SNAPSHOT] > >> > > >>>> > >> > > >>>> at org.apache.felix.gogo.runtime.Pipe.doCall(Pipe.java:417) > >> > > >>>> [28:org.apache.karaf.shell.core:4.1.0.SNAPSHOT] > >> > > >>>> > >> > > >>>> at org.apache.felix.gogo.runtime.Pipe.call(Pipe.java:227) > >> > > >>>> [28:org.apache.karaf.shell.core:4.1.0.SNAPSHOT] > >> > > >>>> > >> > > >>>> at org.apache.felix.gogo.runtime.Pipe.call(Pipe.java:59) > >> > > >>>> [28:org.apache.karaf.shell.core:4.1.0.SNAPSHOT] > >> > > >>>> > >> > > >>>> at java.util.concurrent.FutureTask.run(FutureTask.java:266) > [?:?] > >> > > >>>> > >> > > >>>> at > >> > > >>>> > >> > > >>>> > >> > > >>> > >> > > >> > >> > > > >> > > >> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > >> > > >>>> [?:?] > >> > > >>>> > >> > > >>>> at > >> > > >>>> > >> > > >>>> > >> > > >>> > >> > > >> > >> > > > >> > > >> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > >> > > >>>> [?:?] > >> > > >>>> > >> > > >>>> at java.lang.Thread.run(Thread.java:745) [?:?] > >> > > >>>> > >> > > >>>> The information in the brackets, at the end of each line, is > >> > actually > >> > > >>>> accurate (bundle id, symbolic name, version). Without the > >> > information > >> > > >>>> stored in the Exception, I'm not aware of any way to do that > >> > > >>> unfortunately. > >> > > >>>> > >> > > >>>> 2016-03-18 18:41 GMT+01:00 Matt Sicker <[email protected]>: > >> > > >>>> > >> > > >>>>> What's wrong with the class context from > >> > > >>>>> ReflectionUtil.getCurrentStackTrace() that requires a custom > >> > > >>>> implementation > >> > > >>>>> of Exception? > >> > > >>>>> > >> > > >>>>> On 18 March 2016 at 12:11, Guillaume Nodet <[email protected] > > > >> > > >> wrote: > >> > > >>>>> > >> > > >>>>>> The getClassContext() method is used in pax-logging to render > >> the > >> > > >>>>> exception > >> > > >>>>>> in a nicer way. > >> > > >>>>>> I don't have any problem moving the qualifier to protected or > >> > > >>> whatever, > >> > > >>>>> but > >> > > >>>>>> we'd need to change the code in pax-logging > >> > > >>>>>> > >> > > >>>>>> > >> > > >>>>>> > >> > > >>>>>> > >> > > >>>>> > >> > > >>>> > >> > > >>> > >> > > >> > >> > > > >> > > >> > https://github.com/ops4j/org.ops4j.pax.logging/blob/master/pax-logging-log4j2/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java#L136-L144 > >> > > >>>>>> > >> > > >>>>>> > >> > > >>>>>> > >> > > >>>>>> > >> > > >>>>> > >> > > >>>> > >> > > >>> > >> > > >> > >> > > > >> > > >> > https://github.com/ops4j/org.ops4j.pax.logging/blob/master/pax-logging-service/src/main/java/org/apache/log4j/OsgiThrowableRenderer.java#L62-L67 > >> > > >>>>>> > >> > > >>>>>> It should not be a big deal, but the current code expect the > >> > method > >> > > >>> to > >> > > >>>> be > >> > > >>>>>> public unfortunately. > >> > > >>>>>> > >> > > >>>>>> Guillaume > >> > > >>>>>> > >> > > >>>>>> > >> > > >>>>>> 2016-03-18 17:29 GMT+01:00 Jean-Baptiste Onofré < > >> [email protected] > >> > >: > >> > > >>>>>> > >> > > >>>>>>> Hi Cristiano, > >> > > >>>>>>> > >> > > >>>>>>> I think you are right, it's probably something existing for > a > >> > > >>> while. > >> > > >>>>> I'm > >> > > >>>>>>> just surprised that you encountered now. > >> > > >>>>>>> > >> > > >>>>>>> Let me check your detailed use case that you sent > previously. > >> > > >>>>>>> > >> > > >>>>>>> Regards > >> > > >>>>>>> JB > >> > > >>>>>>> > >> > > >>>>>>> > >> > > >>>>>>> On 03/18/2016 05:14 PM, Cristiano Costantini wrote: > >> > > >>>>>>> > >> > > >>>>>>>> Hello all, > >> > > >>>>>>>> > >> > > >>>>>>>> it is some days I was having troubles using CXF services on > >> > > >>>> ServiceMix > >> > > >>>>>>>> (and > >> > > >>>>>>>> it is some days I spam on the mailing list of ServiceMix, > >> Camel > >> > > >>> and > >> > > >>>>> CXF > >> > > >>>>>>>> :-D > >> > > >>>>>>>> ) and I've finally come to the source of my issues which > are > >> due > >> > > >>> to > >> > > >>>>> the > >> > > >>>>>>>> "endorsed" java.lang.Exception which is used by Karaf: > >> > > >>>>>>>> > >> > > >>>>>>>> > >> > > >>>>>>>> > >> > > >>>>>> > >> > > >>>>> > >> > > >>>> > >> > > >>> > >> > > >> > >> > > > >> > > >> > https://github.com/apache/karaf/blob/master/exception/src/main/java/java/lang/Exception.java > >> > > >>>>>>>> > >> > > >>>>>>>> My problem is due to the fact that this class has a public > >> > > >>> property, > >> > > >>>>>>>> public Class[] getClassContext() { > >> > > >>>>>>>> return classContext; > >> > > >>>>>>>> } > >> > > >>>>>>>> which is seen by JaxB at runtime inside Karaf which cause > it > >> to > >> > > >>>>> marshall > >> > > >>>>>>>> the Exception in SOAP services with a wrong XML, an XML > which > >> > > >>>> include > >> > > >>>>>>>> <classContext> tags. > >> > > >>>>>>>> > >> > > >>>>>>>> The class in Karaf has not changed since committed by > >> Guillaume > >> > > >>>> Nodet > >> > > >>>>> in > >> > > >>>>>>>> 2010, so this issue with CXF has probably always been > there. > >> > > >>>>>>>> > >> > > >>>>>>>> In my opinion, this getter should be private or protected > as > >> I > >> > > >>> guess > >> > > >>>>> it > >> > > >>>>>> is > >> > > >>>>>>>> only used on the nested class method's getThrowableContext > >> (it > >> > > >> is > >> > > >>> a > >> > > >>>>>>>> replacement for the JRE's class, I don't think there are > >> > > >> external > >> > > >>>>>> project > >> > > >>>>>>>> using this modification of the Exception class). > >> > > >>>>>>>> > >> > > >>>>>>>> > >> > > >>>>>>>> To confirm my thesis, I've hacked the > >> > > >>>>>> org.apache.karaf.exception-2.4.0.jar > >> > > >>>>>>>> inside the lib/endorsed folder with a class compiled by > >> myself > >> > > >>> where > >> > > >>>>>> I've > >> > > >>>>>>>> changed the method to > >> > > >>>>>>>> private Class[] getClassContext() { > >> > > >>>>>>>> return classContext; > >> > > >>>>>>>> } > >> > > >>>>>>>> and with this hack, Karaf has continued to work (and my CXF > >> > > >>> service > >> > > >>>>> now > >> > > >>>>>>>> works properly). > >> > > >>>>>>>> > >> > > >>>>>>>> Do you think there are potential side effects in this fix? > >> > > >>>>>>>> Do you need me to open an issue on Jira to handle the > >> problem? > >> > > >>>>>>>> If it is confirmed that the fix of making this method > >> private, > >> > > >> do > >> > > >>>> you > >> > > >>>>>>>> think > >> > > >>>>>>>> it could be included soon on the next Karaf Release? > >> > > >>>>>>>> > >> > > >>>>>>>> Thank you very much to all, > >> > > >>>>>>>> Cristiano > >> > > >>>>>>>> > >> > > >>>>>>>> > >> > > >>>>>>> -- > >> > > >>>>>>> Jean-Baptiste Onofré > >> > > >>>>>>> [email protected] > >> > > >>>>>>> http://blog.nanthrax.net > >> > > >>>>>>> Talend - http://www.talend.com > >> > > >>>>>>> > >> > > >>>>>> > >> > > >>>>>> > >> > > >>>>>> > >> > > >>>>>> -- > >> > > >>>>>> ------------------------ > >> > > >>>>>> Guillaume Nodet > >> > > >>>>>> ------------------------ > >> > > >>>>>> Red Hat, Open Source Integration > >> > > >>>>>> > >> > > >>>>>> Email: [email protected] > >> > > >>>>>> Web: http://fusesource.com > >> > > >>>>>> Blog: http://gnodet.blogspot.com/ > >> > > >>>>>> > >> > > >>>>> > >> > > >>>>> > >> > > >>>>> > >> > > >>>>> -- > >> > > >>>>> Matt Sicker <[email protected]> > >> > > >>>>> > >> > > >>>> > >> > > >>>> > >> > > >>>> > >> > > >>>> -- > >> > > >>>> ------------------------ > >> > > >>>> Guillaume Nodet > >> > > >>>> ------------------------ > >> > > >>>> Red Hat, Open Source Integration > >> > > >>>> > >> > > >>>> Email: [email protected] > >> > > >>>> Web: http://fusesource.com > >> > > >>>> Blog: http://gnodet.blogspot.com/ > >> > > >>>> > >> > > >>> > >> > > >> > >> > > >> > >> > > >> > >> > > >> -- > >> > > >> Matt Sicker <[email protected]> > >> > > >> > >> > > > > >> > > > >> > > -- > >> > > Jean-Baptiste Onofré > >> > > [email protected] > >> > > http://blog.nanthrax.net > >> > > Talend - http://www.talend.com > >> > > > >> > > >> > >> > >> > >> -- > >> ------------------------ > >> Guillaume Nodet > >> ------------------------ > >> Red Hat, Open Source Integration > >> > >> Email: [email protected] > >> Web: http://fusesource.com > >> Blog: http://gnodet.blogspot.com/ > >> > > > -- ------------------------ Guillaume Nodet ------------------------ Red Hat, Open Source Integration Email: [email protected] Web: http://fusesource.com Blog: http://gnodet.blogspot.com/
