[ https://issues.apache.org/jira/browse/LOG4J2-555?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13917569#comment-13917569 ]
Remko Popma commented on LOG4J2-555: ------------------------------------ Hey Gary! I missed your comment. Yeah, I know! The generated code now basically looks very similar to the AbstractLogger implementation of the convenience methods for the built-in levels: {code} public void customLevel(...) { if (logger.isEnabled(lots, of, parameters)) { Message msg = createMessage(); logger.log(marker, fqcn, level, msg, throwable); } } {code} Where before it looked like: {code} public void customLevel(...) { logger.log(available, parameters); } {code} Perhaps a nice solution for this would also allow the code in AbstractLogger to be simplified... Refactoring may be possible, both in the Generate tool and in AbstractLogger. Be aware there are some subtleties with the Throwable that may or may not be the last parameter in logging methods that take a varargs parameter. > 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 > > > *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