[ 
https://issues.apache.org/jira/browse/LOG4J2-555?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13925424#comment-13925424
 ] 

Bruce Brouwer commented on LOG4J2-555:
--------------------------------------

That MsgBuilder stuff looks interesting. I'm not sure I'm for it yet. It is not 
incompatible with my ideas.

I'm working on my own patch for this that I will post soon and I hope to 
receive feedback.

There are a few things I'm trying to do to make it easier for things using the 
wrapper. 
* Instead of FQCN invading the API, which isn't terribly flexible, I've created 
a SourceLocator interface and related classes. This way custom loggers could 
use multiple FQCNs or something completely different.
* Make the interface LoggerProvider in the spi package which extends Logger and 
which AbstractLogger implements. This has a few more isEnabled and log methods 
available which make it possible for extended loggers to use efficiently. 
LoggerContext would start to return LoggerProvider instead of just Logger, and 
other code would stop casting to AbstractLogger and could instead use the 
LoggerProvider interface.

That second point ends up making more methods public on the concrete 
implementations. I had an alternative idea in LOG4J2-562 that would prevent 
these methods from needing to go public. I'll post my patch soon. I'll try to 
get performance numbers, too. 

> Location-based functionality broken in AbstractLoggerWrapper subclasses
> -----------------------------------------------------------------------
>
>                 Key: LOG4J2-555
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-555
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: API, Core
>    Affects Versions: 2.0-rc1
>            Reporter: Remko Popma
>            Assignee: Remko Popma
>             Fix For: 2.0-rc2
>
>         Attachments: LOG4J2-555-delegate.patch
>
>
> *How to reproduce*
> * Create a custom logger that extends {{AbstractLoggerWrapper}} (or generate 
> one with the tool attached to LOG4J2-519)
> * In the custom logger provide a public method that invokes the {{log(Level, 
> String)}} method
> * Configure a pattern layout that uses location, like %C for the logger FQCN
> * From a sample app, call the public method on your custom logger.
> * The output will show the class name of the custom logger instead of the 
> class name of the calling class in the sample application.
> *Cause*
> {{AbstractLogger}}'s FQCN field is {{static final}} and initialized to 
> {{AbstractLogger.class.getName()}}. Then, in 
> {{Log4jLogEvent#calcLocation()}}, when walking over the stack trace elements, 
> the element _following_ the FQCN is returned. So only loggers that directly 
> subclass from {{AbstractLogger}} will work correctly. Loggers that inherit 
> from {{AbstractLoggerWrapper}} are two levels removed from {{AbstractLogger}} 
> and the {{calcLocation()}} method will not work correctly.
> *Solution*
> I think {{AbstractLogger}}'s FQCN field should be made non-static, and 
> initialized to {{getClass().getName()}} in the constructor of 
> {{AbstractLogger}}. {{Log4jLogEvent#calcLocation()}} can then be modified to 
> return the {{StackElement}} whose class name matches the FQCN, instead of the 
> next element. Location-based functionality should then work for arbitrarily 
> deep subclass hierarchies of AbstractLogger.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-dev-h...@logging.apache.org

Reply via email to