This sounds like it'd make a great addition to the Scala API!

On 9 December 2017 at 15:36, Jeffrey Shaw <[email protected]> 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 <[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.
> > >>>
> > >>
> >
> >
>



-- 
Matt Sicker <[email protected]>

Reply via email to