That sounds like a pretty good idea. Matt Sicker
> On Jan 25, 2014, at 15:18, Ralph Goers <ralph.go...@dslextreme.com> wrote: > > Here is what I am implementing: > > 1. Level is now an Interface. This allows the vast amount of code to > continue to work. > 2. The current Level enum has been renamed to StdLevel. It implements the > Level interface. > 3. A new class named Levels is in the spi package of the API. It contains a > ConcurrentMap containing all the registered Levels as well as the static > methods that were previously part of the Level enum. > > For the most part the conversion to this has been pretty easy. The most > frustrating part was that I had to move the toLevel methods from what was the > Level enum to the Levels class as static methods are not allowed in > interfaces until Java 8. This meant I had to modify several classes to use > Levels.toLevel instead of Level.toLevel. In addition, a few classes were > using the valueOf enum method. Those were converted to use Levels.getLevel. > > The few places were Level is actually used as an enum were also pretty easy > to handle as in those cases the custom levels need to be converted to a > StdLevel and then that enum is used. > > Unless anyone objects I plan on committing this later today once I finish it > and create some tests and documentation. > > Ralph > > > >> On Jan 25, 2014, at 12:49 PM, Nicholas Williams >> <nicho...@nicholaswilliams.net> wrote: >> >> No, of course, everyone seems to agree that custom levels should be >> permitted. But I never heard agreement on whether we were going the >> extensible enum route or the Level-as-interface route. The camp still seemed >> to disagree on that. >> >> Nick >> >> Sent from my iPhone, so please forgive brief replies and frequent typos >> >>> On Jan 25, 2014, at 11:20, Ralph Goers <ralph.go...@dslextreme.com> wrote: >>> >>> I have not heard anyone disagree with allowing custom Levels. The >>> disagreement I am hearing is over adding new pre-defined levels. >>> >>> Ralph >>> >>>> On Jan 25, 2014, at 7:29 AM, Nick Williams <nicho...@nicholaswilliams.net> >>>> wrote: >>>> >>>> I may have missed something. Did we decide on an approach? Last I heard, >>>> the camp was still split: Some wanted to go with my extensible enum, >>>> others wanted to change Level to an interface and make a Levels enum. >>>> >>>> So I'm a bit confused. Which implementation are you working on? >>>> >>>> Nick >>>> >>>>> On Jan 25, 2014, at 7:08 AM, Ralph Goers 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 >