Separate logging for JPMS module/layer

Ralph Goers rgoers at apache.org
Fri Oct 5 21:52:31 UTC 2018


OK. The author pushed it to a branch - https://git1-us-west.apache.org/repos/asf?p=logging-log4j2.git;a=commit;h=64bfd314 <https://git1-us-west.apache.org/repos/asf?p=logging-log4j2.git;a=commit;h=64bfd314>.

Ralph

> On Oct 5, 2018, at 1:45 PM, Luke Hutchison <luke.hutch at gmail.com> wrote:
> 
> On Fri, Oct 5, 2018 at 1:58 PM Ralph Goers <rgoers at apache.org <mailto:rgoers at apache.org>> wrote:
> I didn’t write this particular test. I will have to find it.
> 
> I'm curious to see the test as well, especially to see what the "defaultJava8" test is. Is that a method for getting the stack frames using Exception::getStackTrace or something?
> 
> On Fri, Oct 5, 2018 at 11:55 AM David Lloyd <david.lloyd at redhat.com <mailto:david.lloyd at redhat.com>> wrote:
> Something to consider is _how_ the StackWalker is used.  It's
> potentially quite expensive in that it produces a Stream in its full
> usage mode.  Have you compared using the stream + lambda approach
> versus extracting the stream iterator and iterating in the classic
> Java fashion?  I doubt it would make the benchmark competitive, but it
> might help a little bit.
>  
> In my own code, I used StackWalker::forEach rather than StalkWalker::walk, since the stream API has such high overhead. Even lambdas have a high startup overhead for some reason (I think it was 20ms of incurred latency when you first use a lambda, last time I measured it?), but at least forEach should deliver much higher throughput than walk.
> 
> The code I'm using currently is below. I have a few questions:
> 
> (1) Is it correct to try both StackWalker and SecurityManager first with doPrivileged, and then if that fails, without doPrivileged? (i.e. I think it is possible for doPrivileged to fail when non-doPrivileged doesn't fail, *or* vice versa, depending on the security configuration?) -- sorry for the newbie question re. JVM security, I'm having a hard time getting my head around it...
> 
> (2) Is it reasonable to fail over from StackWalker to SecurityManager? Or if StackWalker fails due to security limitations, will SecurityManager always fail due to the same security limitations? (Are their security models a 1:1 match?)
> 
> (3) Under what circumstances can StackWalker and/or SecurityManager obtain more information about a stacktrace than Exception::getStackTrace?
> 
> 
> ----
> 
> 
> private static final class CallerResolver extends SecurityManager {
>     @Override
>     protected Class<?>[] getClassContext() {
>         return super.getClassContext();
>     }
> }
> 
> private static Class<?>[] getCallStack() {
>     // Try StackWalker (JDK 9+)
>     PrivilegedAction<Object> stackWalkerAction = new PrivilegedAction<Object>() {
>         @Override
>         public Object run() {
>             List<Class<?>> stackFrameClasses = new ArrayList<>();
>             StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
>                        .forEach(sf -> stackFrameClasses.add(sf.getDeclaringClass()));
>             return stackFrameClasses.toArray(new Class<?>[0]);
>         }
>     };
>     try {
>         // Try with doPrivileged()
>         return (Class<?>[]) AccessController.doPrivileged(stackWalkerAction);
>     } catch (Exception e) {
>     }
>     try {
>         // Try without doPrivileged()
>         return (Class<?>[]) stackWalkerAction.run();
>     } catch (Exception e) {
>     }
> 
>     // Try SecurityManager
>     PrivilegedAction<Object> callerResolverAction = new PrivilegedAction<Object>() {
>         @Override
>         public Object run() {
>             return new CallerResolver().getClassContext();
>         }
>     };
>     try {
>         // Try with doPrivileged()
>         return (Class<?>[]) AccessController.doPrivileged(callerResolverAction);
>     } catch (Exception e) {
>     }
>     try {
>         // Try without doPrivileged()
>         return (Class<?>[]) callerResolverAction.run();
>     } catch (Exception e) {
>     }
> 
>     // As a fallback, use getStackTrace() to try to get the call stack
>     try {
>         throw new Exception();
>     } catch (final Exception e) {
>         final List<Class<?>> classes = new ArrayList<>();
>         for (final StackTraceElement elt : e.getStackTrace()) {
>             try {
>                 classes.add(Class.forName(elt.getClassName()));
>             } catch (final Throwable e2) {
>                 // Ignore
>             }
>         }
>         if (classes.size() > 0) {
>             return classes.toArray(new Class<?>[0]);
>         } else {
>             // Last-ditch effort -- include just this class in the call stack
>             return new Class<?>[] { Java9Scanner.class };
>         }
>     }
> }
> 
> 
> 
> 
> 



More information about the jigsaw-dev mailing list