Yes, we have found in some situations using the SecurityManager is faster than 
StackWalker.

Ralph

> On Oct 4, 2018, at 3:08 PM, Luke Hutchison <luke.hu...@gmail.com> wrote:
> 
> If you need to read the stack in a manner that is backwards compatible with 
> JDK 8 or earlier, there's also the following mechanism for getting the call 
> stack, by creating a SecurityManager:
> 
> https://github.com/classgraph/classgraph/blob/master/src/main/java/io/github/classgraph/utils/CallStackReader.java
>  
> <https://github.com/classgraph/classgraph/blob/master/src/main/java/io/github/classgraph/utils/CallStackReader.java>
> 
> However, is there a reason to believe the above mechanism might stop working 
> in the future?
> 
> Under what conditions might SecurityManager not allow 
> RuntimePermission("createSecurityManager") , and how common is this likely to 
> be?
> 
> Will there be situations where StackWalker will succeed in reading the call 
> stack but SecurityManager will fail, or vice versa?
> 
> 
> 
> On Thu, Oct 4, 2018 at 3:51 PM Mandy Chung <mandy.ch...@oracle.com 
> <mailto:mandy.ch...@oracle.com>> wrote:
> If you are looking for the immediate caller, you can try
> StackWalker::getCallerClass which only walks the top few
> frames and intends to be lower cost.
> 
> Mandy
> 
> On 10/4/18 2:04 PM, Ralph Goers wrote:
> > Hmm, it would probably be a safe assumption that a Logger will never be 
> > used outside of the module. That isn’t true of the class name, method name 
> > and line number though. I’m not sure how much extra overhead there is in 
> > collecting the module name when you have to collect those to.
> >
> > I should add that when printing exceptions we do cache the file 
> > name/location as we are processing the classes for an extended stack trace. 
> > We probably will want to add the module name to the extended stack trace as 
> > well.
> >
> > Ralph
> >
> >> On Oct 4, 2018, at 10:26 AM, fo...@univ-mlv.fr <mailto:fo...@univ-mlv.fr> 
> >> wrote:
> >>
> >> I was thinking about capturing the call stack when you create the logger 
> >> (to get the module), not when you call the logger.
> >>
> >> cheers,
> >> Rémi
> >>
> >> ----- Mail original -----
> >>> De: "Ralph Goers" <ralph.go...@dslextreme.com 
> >>> <mailto:ralph.go...@dslextreme.com>>
> >>> À: "Alex Sviridov" <ooo_satu...@mail.ru <mailto:ooo_satu...@mail.ru>>
> >>> Cc: "Remi Forax" <fo...@univ-mlv.fr <mailto:fo...@univ-mlv.fr>>, 
> >>> "jigsaw-dev" <jigsaw-dev@openjdk.java.net 
> >>> <mailto:jigsaw-dev@openjdk.java.net>>
> >>> Envoyé: Mercredi 3 Octobre 2018 05:08:27
> >>> Objet: Re: Separate logging for JPMS module/layer
> >>> Log4j handles this by capturing the fully qualified class name of the 
> >>> logging
> >>> adapter. Obviously, this doesn’t work if the adapter doesn’t pass Log4j 
> >>> the
> >>> FQCN, but it does work for the adapters we support.  That said, it is 
> >>> very slow
> >>> to capture this and is probably the biggest pain point. Log4j recommends 
> >>> not
> >>> capturing this information in production environments because it is so 
> >>> slow.
> >>> Unfortunately, it seems to have gotten even slower in Java 9+. In an ideal
> >>> world we would be able to capture the caller information at compile time 
> >>> but
> >>> Java provides no good way to do this. Wouldn’t it be great if I could 
> >>> just code
> >>> something like logger.error(_CallerInfo_, “hello”) and the compiler would
> >>> provide the caller info data structure that was generated by the compiler?
> >>>
> >>> FWIW, I do plan to add the module information to the caller information 
> >>> provided
> >>> with Log4j but just haven’t gotten to it. You are more than welcome to 
> >>> provide
> >>> a patch.
> >>>
> >>> Ralph
> >>>
> >>>> On Oct 2, 2018, at 3:20 PM, Alex Sviridov <ooo_satu...@mail.ru 
> >>>> <mailto:ooo_satu...@mail.ru>> wrote:
> >>>>
> >>>> Thank you for you suggestion. But can this be used when some library
> >>>> uses one logging system and for another uses some bridge. Because of this
> >>>> bridging
> >>>> LoggerFactory.getLogger is called somewhere in bridge, as I understand,
> >>>>
> >>>>
> >>>>> Среда,  3 октября 2018, 1:12 +03:00 от Remi Forax <fo...@univ-mlv.fr 
> >>>>> <mailto:fo...@univ-mlv.fr>>:
> >>>>>
> >>>>> You can use the StackWalker
> >>>>> https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/StackWalker.html
> >>>>>  
> >>>>> <https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/StackWalker.html>
> >>>>>
> >>>>> regards,
> >>>>> Rémi
> >>>>>
> >>>>> ----- Mail original -----
> >>>>>> De: "Alex Sviridov" < ooo_satu...@mail.ru <mailto:ooo_satu...@mail.ru> 
> >>>>>> >
> >>>>>> À: "jigsaw-dev" < jigsaw-dev@openjdk.java.net 
> >>>>>> <mailto:jigsaw-dev@openjdk.java.net> >
> >>>>>> Envoyé: Mardi 2 Octobre 2018 23:54:48
> >>>>>> Objet: Separate logging for JPMS module/layer
> >>>>>> Hi all,
> >>>>>>
> >>>>>> Could anyone say how the following problem can be solved. I want to 
> >>>>>> create
> >>>>>> separate
> >>>>>> log file for every JPMS module/layer. The problem is that many
> >>>>>> libraries/programs
> >>>>>> use LoggerFactory.getLogger(String className) so in getLogger I have 
> >>>>>> only
> >>>>>> the name of the class as String, so I can't get module and layer.
> >>>>>>
> >>>>>> If I had not String className, but Class klass then the problem would 
> >>>>>> be easily
> >>>>>> solved.
> >>>>>> As I understand I can't load class by name because it would require 
> >>>>>> all modules
> >>>>>> export
> >>>>>> their packages to logging framework that has no sense.
> >>>>>>
> >>>>>> Are there any solutions for such problem?
> >>>>>>
> >>>>>>
> >>>>>> --
> >>>>>> Alex Sviridov
> >>>>
> >>>> --
> >>>> Alex Sviridov
> >
> 

Reply via email to