I am concerned because users can create customer Appenders and Layouts that 
will be affected by a change to the signature of getSource() in the LogEvent. I 
suspect that there are other things that use the LogEvent (the Logging Server? 
Lillith?) that would be impacted by this.

Ralph

> On Dec 22, 2017, at 12:26 PM, Jeffrey Shaw <shawj...@gmail.com> wrote:
> 
> I didn't know about clirr, but I can try running that. I tried to not break
> any existing public methods.
> 
> I created SourceLocation because I think for Scala macros, the method name
> can not exist, but StackTraceElement requires a method name. I'll double
> check this.
> 
> On Thu, Dec 21, 2017 at 12:40 AM, Ralph Goers <ralph.go...@dslextreme.com>
> wrote:
> 
>> I’m not sure I would be comfortable applying the patch this way. Have you
>> run a clirr report on your changes? I am concerned that this could break
>> customizations that users might have made. What is the reason
>> SourceLocation had to be used instead of StackTraceElement?
>> 
>> Ralph
>> 
>>> On Dec 20, 2017, at 9:58 PM, Jeffrey Shaw <shawj...@gmail.com> wrote:
>>> 
>>> It looks like the location only ever gets the file name, because that's
>>> what StackTraceElement gives. So that's fine.
>>> 
>>> I think I'm ready for a formal review. Should I create pull requests on
>>> github for https://github.com/shawjef3/logging-log4j2/tree/message-
>> location
>>> and https://github.com/shawjef3/logging-log4j-scala/tree/
>> message-location,
>>> or is there another process?
>>> 
>>> On Wed, Dec 20, 2017 at 2:11 PM, Matt Sicker <boa...@gmail.com> wrote:
>>> 
>>>> I think that should be configurable in the layout options.
>>>> 
>>>> On 20 December 2017 at 13:04, Dominik Psenner <dpsen...@gmail.com>
>> wrote:
>>>> 
>>>>> Could a compile time environment variable like SrcRootDirectory do the
>>>> job?
>>>>> 
>>>>> On 20 Dec 2017 7:49 p.m., "Jeffrey Shaw" <shawj...@gmail.com> wrote:
>>>>> 
>>>>>> I got it working using a custom ExtendedLogger instead of mocking.
>>>>>> 
>>>>>> It looks like for file name, there are only two options. We can have
>>>> the
>>>>>> file name, or the full path to the file. The path relative to the
>>>> project
>>>>>> root looks impossible to get, unless we look for magic names like
>>>> "src".
>>>>>> Any opinion as to which to use? I'm tempted to use just the file name,
>>>>>> since the full path to the file seems intrusive, and is dependent on
>>>> the
>>>>>> build machine.
>>>>>> 
>>>>>> On Wed, Dec 20, 2017 at 11:35 AM, Matt Sicker <boa...@gmail.com>
>>>> wrote:
>>>>>> 
>>>>>>> It's possible that macros and mocks don't work well together, though
>>>>>> that's
>>>>>>> just a guess.
>>>>>>> 
>>>>>>> On 20 December 2017 at 00:00, Jeff Shaw <shawj...@gmail.com> wrote:
>>>>>>> 
>>>>>>>> I should add that manually testing it works.
>>>>>>>> 
>>>>>>>> Sent from my phone
>>>>>>>> 
>>>>>>>>> On Dec 20, 2017, at 12:45 AM, Jeffrey Shaw <shawj...@gmail.com>
>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>> I added some tests for traced, but they don't pass. The mocks
>>>> say,
>>>>>>>> "Actually, there were zero interactions with this mock." I could
>>>> use
>>>>>> some
>>>>>>>> help getting these two tests to work.
>>>>>>>>> 
>>>>>>>>> https://github.com/shawjef3/logging-log4j-scala/blob/
>>>>>>>> message-location/log4j-api-scala_2.12/src/test/scala/org/
>>>>>>>> apache/logging/log4j/scala/LoggerTest.scala#L574
>>>>>>>>> 
>>>>>>>>>> On Sun, Dec 17, 2017 at 8:50 PM, Jeffrey Shaw <
>>>> shawj...@gmail.com
>>>>>> 
>>>>>>>> wrote:
>>>>>>>>>> Thanks for the encouragement everyone! I never worked on an
>>>> Apache
>>>>>>>> project before and had no idea what to expect from the community.
>>>>>>>>>> 
>>>>>>>>>> I've made some progress. One cool thing I added was a `traced`
>>>>>> method
>>>>>>>> (source), which does the work you'd want for traceEntry, traceExit,
>>>>> and
>>>>>>>> throwing. It would be cool to add catching as well, but that would
>>>>>>> require
>>>>>>>> tree traversal, which is beyond me at the moment. I also haven't
>>>>>> figured
>>>>>>>> out how to add the parameter lists. Anyway, an example:
>>>>>>>>>> 
>>>>>>>>>> before:
>>>>>>>>>> def f() = {...}
>>>>>>>>>> 
>>>>>>>>>> after:
>>>>>>>>>> def f() = logger.traced(Level.INFO) {...}
>>>>>>>>>> 
>>>>>>>>>>> On Mon, Dec 11, 2017 at 9:55 PM, Matt Sicker <boa...@gmail.com
>>>>> 
>>>>>>> wrote:
>>>>>>>>>>> From the little I've worked with macros (worked more with
>>>>> scalameta
>>>>>>> and
>>>>>>>>>>> shapeless), that looks good so far. If you can add some unit
>>>>> tests,
>>>>>>>> then
>>>>>>>>>>> we'd be happy to merge!
>>>>>>>>>>> 
>>>>>>>>>>> On 11 December 2017 at 20:41, Jeffrey Shaw <shawj...@gmail.com
>>>>> 
>>>>>>> wrote:
>>>>>>>>>>> 
>>>>>>>>>>>> Great news! I'm able to run LoggingApp in the scala api repo
>>>>>>> without
>>>>>>>> it
>>>>>>>>>>>> calling StackLocatorUtil.calcLocation, but it prints the same
>>>>>>>> messages as
>>>>>>>>>>>> before. I have to use my patch to log4j of course.
>>>>>>>>>>>> 
>>>>>>>>>>>> See https://github.com/shawjef3/logging-log4j-scala/commits/
>>>>>>>>>>>> message-location
>>>>>>>>>>>> 
>>>>>>>>>>>> On Sun, Dec 10, 2017 at 3:56 PM, Matt Sicker <
>>>> boa...@gmail.com
>>>>>> 
>>>>>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>>> This sounds like it'd make a great addition to the Scala
>>>> API!
>>>>>>>>>>>>> 
>>>>>>>>>>>>> On 9 December 2017 at 15:36, Jeffrey Shaw <
>>>>> shawj...@gmail.com>
>>>>>>>> wrote:
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Ralph, I agree with you entirely. My intent for these new
>>>>> log
>>>>>>>> methods
>>>>>>>>>>>> is
>>>>>>>>>>>>>> that they only be called from compile-time generated
>>>> code.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On Sat, Dec 9, 2017 at 4:30 PM, Ralph Goers <
>>>>>>>>>>>> ralph.go...@dslextreme.com>
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> I don’t understand how this is a good idea. To use this
>>>>> you
>>>>>>>> would
>>>>>>>>>>>> need
>>>>>>>>>>>>> to
>>>>>>>>>>>>>>> do something like:
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Message msg = new StringMessage(getCaller(), “My
>>>>> Message”);
>>>>>>>>>>>>>>> logger.debug(msg);
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Unfortunately the line number would point to the line
>>>>> where
>>>>>>>>>>>> getCaller()
>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>> called not to the logger statement.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> I had thought about modifying AbstractLogger to do
>>>>>>>>>>>>>>> public void debug(final Marker marker, final String
>>>>>> message)
>>>>>>> {
>>>>>>>>>>>>>>>   logIfEnabled(getCaller(), Level.DEBUG, marker,
>>>>> message,
>>>>>>>>>>>> (Throwable)
>>>>>>>>>>>>>>> null);
>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>> instead of the current
>>>>>>>>>>>>>>> public void debug(final Marker marker, final String
>>>>>> message)
>>>>>>> {
>>>>>>>>>>>>>>>   logIfEnabled(FQCN, Level.DEBUG, marker, message,
>>>>>>>> (Throwable)
>>>>>>>>>>>> null);
>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>> But the amount of changes required to get it into the
>>>>>>> LogEvent
>>>>>>>> was
>>>>>>>>>>>>> large.
>>>>>>>>>>>>>>> OTOH, if we create a CallerLocationMessage that
>>>> contains
>>>>>> the
>>>>>>>>>>>>>>> StackTraceElement and then have existing Messages
>>>> extend
>>>>>> that
>>>>>>>> then we
>>>>>>>>>>>>>> could
>>>>>>>>>>>>>>> store the location in the Message if it is a
>>>>>>>> CallerLocationMessage.
>>>>>>>>>>>>>> Calling
>>>>>>>>>>>>>>> getCaller() in this way would be much better since it
>>>> is
>>>>>> at a
>>>>>>>> fixed
>>>>>>>>>>>>> depth
>>>>>>>>>>>>>>> from the caller.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> With Java 9 this could become:
>>>>>>>>>>>>>>> public void debug(final Marker marker, final String
>>>>>> message)
>>>>>>> {
>>>>>>>>>>>>>>>   logIfEnabled(stackWalker.walk(
>>>>>> s->s.skip(1).findFirst(),
>>>>>>>>>>>>> Level.DEBUG,
>>>>>>>>>>>>>>> marker, message, (Throwable) null);
>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>> although that would pass a StackFrame instead of a
>>>>>>>> StackTraceElement.
>>>>>>>>>>>>> The
>>>>>>>>>>>>>>> only problems with this is that there is still some
>>>>>> overhead
>>>>>>> in
>>>>>>>>>>>> calling
>>>>>>>>>>>>>>> StackWalker like this. Also, if this is called from a
>>>>>> facade,
>>>>>>>> such as
>>>>>>>>>>>>>>> log4j-slf4j-impl then the number of levels that have to
>>>>> be
>>>>>>>> skipped
>>>>>>>>>>>>> would
>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>> different.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> I would really prefer if there was some way to capture
>>>>> the
>>>>>>> line
>>>>>>>>>>>> number
>>>>>>>>>>>>>>> information for the various loggers when the annotation
>>>>>>>> processor
>>>>>>>>>>>> runs
>>>>>>>>>>>>> at
>>>>>>>>>>>>>>> compile time.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Ralph
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> On Dec 9, 2017, at 1:22 PM, Jeffrey Shaw <
>>>>>>> shawj...@gmail.com
>>>>>>>>> 
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Thanks for the link, Mikael. I'll take a look at it.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> I added some plumbing to core to allow clients to
>>>> pass
>>>>> a
>>>>>>>>>>>>>>> StackTraceElement
>>>>>>>>>>>>>>>> to loggers. I'd like a code review. I'm happy to try
>>>>>> other
>>>>>>>> methods.
>>>>>>>>>>>>> See
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>> following commit.
>>>>>>>>>>>>>>>> https://github.com/shawjef3/logging-log4j2/commit/
>>>>>>>>>>>>>>> 9c42073e9ca4f25a2f4075b1791eee2893534c54
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> On Sat, Dec 9, 2017 at 10:09 AM, Mikael Ståldal <
>>>>>>>> mi...@apache.org>
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Have you tried the Log4j Scala API?
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> http://logging.apache.org/
>>>> log4j/2.x/manual/scala-api.
>>>>>> html
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> It does currently not support this, but it uses
>>>> Scala
>>>>>>>> macros, and
>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>> could be added there. But log4j-api and/or
>>>> log4j-core
>>>>>>>> probably
>>>>>>>>>>>> needs
>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> adapted as well.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> On 2017-12-09 07:30, Jeffrey Shaw wrote:
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Hello,
>>>>>>>>>>>>>>>>>> I've found that I am able to use Scala macros to
>>>>>> provide
>>>>>>>>>>>>> compile-time
>>>>>>>>>>>>>>>>>> source information for log messages. However, I
>>>> don't
>>>>>> see
>>>>>>>> a way
>>>>>>>>>>>> to
>>>>>>>>>>>>>>> inject
>>>>>>>>>>>>>>>>>> this into log4j's logging mechanism.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> I'm wondering if there is something I'm missing, or
>>>>> if
>>>>>>>> LogEvent's
>>>>>>>>>>>>>>>>>> getSource
>>>>>>>>>>>>>>>>>> method could be duplicated in Message.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> We could then have zero-overhead location
>>>> information
>>>>>> in
>>>>>>>> logs.
>>>>>>>>>>>> I'm
>>>>>>>>>>>>>>>>>> thinking
>>>>>>>>>>>>>>>>>> that tools other than Scala could also take
>>>> advantage
>>>>>> of
>>>>>>>> this.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> --
>>>>>>>>>>>>> Matt Sicker <boa...@gmail.com>
>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> --
>>>>>>>>>>> Matt Sicker <boa...@gmail.com>
>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> --
>>>>>>> Matt Sicker <boa...@gmail.com>
>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>>> 
>>>> 
>>>> --
>>>> Matt Sicker <boa...@gmail.com>
>>>> 
>> 
>> 
>> 


Reply via email to