Separate logging for JPMS module/layer
Mandy Chung
mandy.chung at oracle.com
Thu Oct 4 22:24:11 UTC 2018
On 10/4/18 3:08 PM, Luke Hutchison 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
>
> 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?
>
It depends on whether the security manager is created with a
doPrivileged and whether the permission is granted to the code source
creating the security manager.
> Will there be situations where StackWalker will succeed in reading the
> call stack but SecurityManager will fail, or vice versa?
>
SecurityManager::getClassContext is designed for the security permission
check. It's not for stack walking.
The stackwalker returns the frames it traverses and if not filtered.
SM::getClassContext is for permission check and it may filter
unnecessary frames as it wishes (for example native frames as I see).
Mandy
>
>
> On Thu, Oct 4, 2018 at 3:51 PM Mandy Chung <mandy.chung at oracle.com
> <mailto:mandy.chung at 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, forax at univ-mlv.fr
> <mailto:forax at 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.goers at dslextreme.com
> <mailto:ralph.goers at dslextreme.com>>
> >>> À: "Alex Sviridov" <ooo_saturn7 at mail.ru
> <mailto:ooo_saturn7 at mail.ru>>
> >>> Cc: "Remi Forax" <forax at univ-mlv.fr
> <mailto:forax at univ-mlv.fr>>, "jigsaw-dev"
> <jigsaw-dev at openjdk.java.net <mailto:jigsaw-dev at 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_saturn7 at mail.ru <mailto:ooo_saturn7 at 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
> <forax at univ-mlv.fr <mailto:forax at univ-mlv.fr>>:
> >>>>>
> >>>>> You can use the StackWalker
> >>>>>
> 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_saturn7 at mail.ru
> <mailto:ooo_saturn7 at mail.ru> >
> >>>>>> À: "jigsaw-dev" < jigsaw-dev at openjdk.java.net
> <mailto:jigsaw-dev at 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
> >
>
More information about the jigsaw-dev
mailing list