Unfortunately, we can’t use getCallerClass. Some API methods can be called by 
users of the API or by other methods in the API class.

Ralph

> On Oct 4, 2018, at 2:50 PM, Mandy Chung <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