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 <[email protected]>
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 <[email protected]> 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 <[email protected]>
> 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.
> >>>
> >>
>
>

Reply via email to