I've started to work on implementing a source code generator along the lines described below.
Does anyone disagree with this approach? I was thinking to name the tools Generate$ExtendedLogger and Generate$CustomLogger and put the Generate class in the log4j-api project under org.apache.logging.log4j.util or create a new package called org.apache.logging.log4j.experimental. Thoughts? On Tuesday, January 28, 2014, Remko Popma <remko.po...@gmail.com> wrote: > More thoughts on CustomLogger/ExtendedLogger source code generation: > > > Perhaps I was overcomplicating things... > > Why don't we generate source for a concrete class instead of an > interface+implementation? > > > If users want to /extend/ Logger, this class would extend > AbstractLoggerWrapper (which has the standard debug(), info(), warn(), ... > methods). > > > If users want to hide the standard methods, the generated class would > simply not extend AbstractLoggerWrapper, so the only public methods would > be the generated methods for the custom log levels. > > > This allows users to generate both extended loggers (with extra methods) > and custom domain specific Loggers (like a logger that only has defcon1(), > defcon2(), defcon3() methods). > > > Note: this would also enable users to /take away/ existing log4j log > levels. > > Suppose you don't like the FATAL or TRACE log levels? > > Simply generate a custom logger with levels ERROR=200 WARN=300 INFO=400 > DEBUG=500. > > > Since this is a wrapper, there is no need for API changes or additional > methods on LogManager: the generated custom logger has factory methods that > internally call the existing LogManager.getLogger() methods and wrap the > resulting Logger. > > > So in client code, users would obtain a custom logger this way: > > MyLogger logger = MyLogger.create(MyClass.class); > > > Thoughts? > > > > On Tuesday, January 28, 2014, Gary Gregory > <garydgreg...@gmail.com<javascript:_e({}, 'cvml', 'garydgreg...@gmail.com');>> > wrote: > >> On Mon, Jan 27, 2014 at 2:15 PM, Nick Williams < >> nicho...@nicholaswilliams.net> wrote: >> >> I would veto such a change, and here is my technical justification: >> >> You will break EVERYTHING currently using the Log4j 2 API. >> >> EVERYTHING that EVERY Log4j 2 user has currently written will have to be >> changed to use StandardLogger instead of Logger. That's not even >> considering the fact that Logger (or ILogger as the case may be) is *the* >> industry standard for logger interface names that provide info(), warn(), >> and other methods. I know that APIs can change when something's still beta, >> but this is a HUGE CHANGE. >> >> However, what I WOULD be okay with is creating a SimpleLogger interface >> for things like log(Level, ...), etc. and having Logger extend SimpleLogger >> to provide info(), warn(), and so on. This would be backwards compatible >> and abide by industry norms. >> >> >> Of course, let's not get caught up in the names here and focus on the >> design first. What matters is that the current interface in split between a >> generic Level agnostic parent and a DSL sub-interface. I agree that 80/20 >> says that "Logger" should be the name of the interface that has info(), >> warn() and so on. The parent can be called LevelLogger for example since it >> must be called with a Level. I do not like "SimpleLogger" because it does >> not describe anything and 'simple' feels like a judgment call. >> >> Gary >> >> >> >> Nick >> >> On Jan 27, 2014, at 12:46 PM, Gary Gregory wrote: >> >> On Mon, Jan 27, 2014 at 10:24 AM, Paul Benedict <pbened...@apache.org>wrote: >> >> I propose this: >> >> 1) If you are willing to view standard levels as a type of DSL, then you >> should refactor the Logger interface to separate those concerns. Create a >> new superinterface that contains everything else. This is what custom >> loggers will extend. >> >> >> That's brilliant! The Logger interface contains methods like log(Level, >> ...) and StandardLogger extends Logger to provide info(), warn() and so on. >> >> This let's me create a custom Logger (DEFCON example) AND an extension to >> StandardLogger with refined levels (NOTICE, DIAG, VERBOSE). >> >> This makes it clear that a Custom Logger is different than an Extensible >> Logger to StandardLogger. >> >> Gary >> >> >> 2) The customer loggers not only register an interface but also the >> implementation that goes with it. >> >> 3) Retrieve a custom logger as follows: >> <T extends LoggerSuperInterface> T Logger.getCustomLogger(T t); >> >> Paul >> >> >> On Mon, Jan 27, 2014 at 8:51 AM, Gary Gregory <garydgreg...@gmail.com>wrote: >> >> I also want to avoid extending Logger for domain specific applications. >> For medical devices for example I could only have critical, warning, >> advisory. >> >> >> -------- Original message -------- >> From: Remko Popma >> Date:01/27/2014 09:15 (GMT-05:00) >> To: Log4J Developers List >> Subject: Re: Using Custom Levels with a Custom/Wrapper Interface >> >> How about starting with something very simple at first? >> >> We provide a tool that generates the source code for a custom logger >> interface. >> To invoke the tool the user passes it the fully qualified name of the >> interface, and a list of NAME=INTLEVEL custom log lev >> >> -- >> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >> Java Persistence with Hibernate, Second >> Edition<http://www.manning.com/bauer3/> >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >> Spring Batch in Action <http://www.manning.com/templier/> >> Blog: http://garygregory.wordpress.com >> Home: http://garygregory.com/ >> Tweet! http://twitter.com/GaryGregory >> >