I’ve committed the changes. Take a look at ExtendedLevels.java, ExtendedLevelTest.java and log4j-customLevel.xml in the log4j-core test directories to see how it works.
Ralph On Jan 26, 2014, at 1:19 AM, Remko Popma <remko.po...@gmail.com> wrote: > I'm very curious! Can't wait to see it. Go for it! > > On Sunday, January 26, 2014, Ralph Goers <ralph.go...@dslextreme.com> wrote: > I have completed the work on custom levels. It uses a variation of Nick’s > “extensible enum” class. The major difference with what he proposed is that > the custom enums must be declared in a class annotated with > @Plugin(name=“xxxx” category=“Level”) for them to be usable during > configuration. > > Are their any objections to me checking this in? I’ll be doing the commit at > around noon Pacific Daylight Time if I don’t hear any. > > Ralph > > > > On Jan 25, 2014, at 7:08 AM, Ralph Goers <ralph.go...@dslextreme.com> wrote: > >> I am working on the implementation of custom levels now. I should have it >> done today. >> >> Ralph >> >> On Jan 24, 2014, at 7:07 PM, Remko Popma <remko.po...@gmail.com> wrote: >> >>> What is the best way to make progress on the custom levels implementation? >>> >>> Do we re-open LOG4J-41 or start a fresh Jira ticket? For implementation >>> ideas, do we attach files to Jira, or create a branch? >>> >>> Remko >>> >>> On Saturday, January 25, 2014, Gary Gregory <garydgreg...@gmail.com> wrote: >>> On Fri, Jan 24, 2014 at 11:48 AM, Remko Popma <remko.po...@gmail.com> wrote: >>> Gary, >>> >>> The hard-coded levels were proposed because it seemed that the extensible >>> enum idea raised by Nick was not going to be accepted. >>> My original position was that Markers could fulfill the requirement but >>> Nick and yourself made it clear that this was not satisfactory. >>> >>> With extensible enums and markers off the table it seemed that the >>> hard-coded levels was the only alternative, and discussion ensued about >>> what these levels should be called and what strength they should have. >>> >>> During this discussion, several people, including me, repeatedly expressed >>> strong reservations about adding pre-defined levels, but by this time I >>> think people were thinking there was no alternative. >>> >>> It looked like we were getting stuck, with half the group moving in one >>> direction ("add pre-defined levels!") and the other half wanting to move in >>> another direction ("don't add pre-defined levels!"). I asked that we >>> re-reviewed our assumptions and try to reach a solution that would satisfy >>> all users. >>> >>> We then decided to explore the option of using extensible enums again. This >>> is still ongoing, but I haven't seen anyone arguing against this idea since >>> we started this thread. >>> >>> Hard-coded levels and the extensible enum are different solutions to the >>> same problem. >>> >>> Hello All: >>> >>> Absolutely not. See my DEFCON example. >>> Talking about an "extensible enum" is mixing design and implementation, we >>> are talking about 'custom' and/or 'extensible' levels. >>> Custom/Extensible levels can be designed to serve one or all of: >>> >>> - Allow inserting custom levels between built-in levels. >>> - Allow for domain specific levels outside of the concept of built-in >>> levels, the DEFCON example. >>> - Should the custom levels themselves be extensible? >>> >>> Gary >>> >>> The extensible enum solution satisfies all of us who are opposed to adding >>> pre-defined levels, while also satisfying the original requirement raised >>> by Nick and yourself. Frankly I don't understand why you would still want >>> the pre-defined levels. >>> >>> Remko >>> >>> >>> >>> On Sat, Jan 25, 2014 at 12:53 AM, Gary Gregory <garydgreg...@gmail.com> >>> wrote: >>> On Thu, Jan 23, 2014 at 10:45 PM, Remko Popma <remko.po...@gmail.com> wrote: >>> Gary, >>> >>> I think that's a very cool idea! >>> Much more flexible, powerful and elegant than pre-defined levels could ever >>> be. >>> >>> As I wrote: "I am discussing custom levels here with the understanding that >>> this is a separate topic from what the built-in levels are." >>> >>> I'm not sure why you want to make the features mutually exclusive. (Some) >>> others agree that these are different features. >>> >>> I see two topics: >>> >>> - What are the default levels for a 21st century logging framework. Do we >>> simply blindly copy Log4j 1? Or do we look at frameworks from different >>> languages and platforms for inspiration? >>> - How (not if, I think we all agree) should we allow for custom levels. >>> >>> Gary >>> >>> It definitely makes sense to design the extensible enum with this potential >>> usage in mind. >>> >>> Remko >>> >>> >>> On Friday, January 24, 2014, Gary Gregory <garydgreg...@gmail.com> wrote: >>> I am discussing custom levels here with the understanding that this is a >>> separate topic from what the built-in levels are. Here is how I convinced >>> myself that custom levels are a “good thing”. >>> >>> No matter which built-in levels exits, I may want custom levels. For >>> example, I want my app to use the following levels DEFCON1, DEFCON2, >>> DEFCON3, DEFCON4, and DEFCON5. This might be for one part of my app or a >>> whole subsystem, no matter, I want to use the built-in levels in addition >>> to the DEFCON levels. It is worth mentioning that if I want that feature >>> only as a user, I can “skin” levels in a layout and assign any label to the >>> built-in levels. If I am also a developer, I want to use DEFCON levels in >>> the source code. >>> >>> >>> >>> At first, my code might look like: >>> >>> >>> >>> logger.log(DefconLevels.DEFCON5, “All is quiet”); >>> >>> >>> >>> Let’s put aside for now the type of DefconLevels.DEFCON* objects. I am a >>> user, and I care about my call sites. >>> >>> >>> >>> What I really want of course is to write: >>> >>> >>> >>> defconLogger.defcon5(“All is quiet”) >>> >>> >>> >>> Therefore, I argue that for any “serious” use of a custom level, I will >>> wrap a Logger in a custom logger class providing call-site friendly methods >>> like defcon5(String). >>> >>> >>> >>> So now, as a developer, all I care about is DefConLogger. It might wrap (or >>> subclass) the Log4J Logger, who knows. The implementation of DefConLogger >>> is not important to the developer (all I care is that the class has >>> ‘defconN’ method) but it is important to the configuration author. This >>> tells me that as a developer I do not care how DefConLogger is implemented, >>> with custom levels, markers, or elves. However, as configuration author, I >>> also want to use DEFCON level just like the built-in levels. >>> >>> >>> >>> The configuration code co >>> >>> >>> >>> >>> -- >>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>> Java Persistence with Hibernate, Second Edition >>> JUnit in Action, Second Edition >>> Spring Batch in Action >>> Blog: http://garygregory.wordpress.com >>> Home: http://garygregory.com/ >>> Tweet! http://twitter.com/GaryGregory >> >