I didn’t write this particular test. I will have to find it.

Ralph

> On Oct 5, 2018, at 11:28 AM, Mandy Chung <mandy.ch...@oracle.com> wrote:
> 
> I recalled at one point you showed your benchmark that
> actually walks the entire stack.  So does your benchmark
> compare walking N number of frames with different Ns and
> also entire stack?
> 
> Mandy
> 
> On 10/4/18 9:46 PM, Ralph Goers wrote:
>> I should have rephrased this. We cannot assume that the caller of the Log4j 
>> API method is the caller we need. It might be another Log4j API method or 
>> another logging Adapter. Since walking the stack trace is relatively slow we 
>> have to defer doing it until we absolutely need to. This generally means we 
>> are not walking only a few frames. We have run benchmarks that show using 
>> SecurityManager to find the caller class is faster than using StackWalker.
>> 
>> https://lists.apache.org/thread.html/29ca67b98c8a508f2836301ac33747b72ca0ce86f69f466073412bfc@%3Cdev.logging.apache.org%3E
>>  
>> <https://lists.apache.org/thread.html/29ca67b98c8a508f2836301ac33747b72ca0ce86f69f466073412bfc@%3Cdev.logging.apache.org%3E>
>> 
>> Ralph
>> 
>>> On Oct 4, 2018, at 9:25 PM, Ralph Goers <rgo...@apache.org 
>>> <mailto:rgo...@apache.org>> wrote:
>>> 
>>> 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 
>>>> <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