Great! That plus support for defining custom levels from the config (with
no custom class required) would mean we would have found a solution that I
believe resolves everyone's issues.

Scott
On Jan 25, 2014 6:52 PM, "Remko Popma" <remko.po...@gmail.com> wrote:

> I've started to think about how to implement Gary's idea to use these
> custom levels to generate code that would add methods to the Logger
> interface, but I think I'll wait a little to see what form the custom
> levels take.
>
>
> On Sun, Jan 26, 2014 at 11:45 AM, Remko Popma <remko.po...@gmail.com>wrote:
>
>> These are the switches I found:
>> * log4j-1.2-api: org.apache.log4j.Category - just FYI, it looks like this
>> switch is missing the FATAL level... is this a bug?
>> * log4j-api: org.apache.logging.log4j.status.StatusLogger
>> * log4j-core: org.apache.logging.log4j.core.net.Severity
>> * log4j-core: org.apache.logging.log4j.core.pattern.LevelPatternConverter
>> - perhaps just return "level " + level.toString(); ?
>> * log4j-to-slf4j: org.apache.logging.slf4j.SLF4JLogger
>>
>>
>>
>> On Sun, Jan 26, 2014 at 11:41 AM, Ralph Goers <ralph.go...@dslextreme.com
>> > wrote:
>>
>>> I am not sure what you mean by this.  I have already succeeded in adding
>>> custom level names to the configuration and making them be valid.  I am
>>> just trying to clean it up a bit based on what Nick is suggesting.
>>>
>>> Ralph
>>>
>>> On Jan 25, 2014, at 6:30 PM, Scott Deboy <scott.de...@gmail.com> wrote:
>>>
>>> There's no way to add support for users to define level entries (name
>>> and value pairs as a new element in the config) and have us do the work to
>>> make those valid? That would get get rid of my request for additional
>>> levels, right?
>>> On Jan 25, 2014 6:15 PM, "Ralph Goers" <ralph.go...@dslextreme.com>
>>> wrote:
>>>
>>>> The class is needed because it is a name and a value (two items) that
>>>> has to be represented as a single parameter to Logger methods.  Using raw
>>>> int or String is not a good alternative.
>>>>
>>>> Ralph
>>>>
>>>> On Jan 25, 2014, at 4:54 PM, Scott Deboy <scott.de...@gmail.com> wrote:
>>>>
>>>> If levels are just a name and a value why require a class at all? What
>>>> about just having it defined in the configuration.
>>>> On Jan 25, 2014 4:37 PM, "Ralph Goers" <ralph.go...@dslextreme.com>
>>>> wrote:
>>>>
>>>>> Because we don’t know the class name that the Level belongs to.  It is
>>>>> referenced in the configuration just as “DIAG”, not
>>>>> “org.apache.logging.test.ExtendedLevel.DIAG”.
>>>>>
>>>>> In any case I fixed it.  I just annotated the new Level as a Plugin
>>>>> and then look up all the Level plugins in BaseConfiguration. Simply 
>>>>> calling
>>>>> the getEnumConstants method on each of the classes does the trick.
>>>>>
>>>>> Ralph
>>>>>
>>>>>
>>>>>
>>>>> On Jan 25, 2014, at 4:26 PM, Paul Benedict <pbened...@apache.org>
>>>>> wrote:
>>>>>
>>>>> If you made it a requirement for the constructor to register, why not
>>>>> just instantiate each level as you encounter it in the config?
>>>>>
>>>>>
>>>>> On Sat, Jan 25, 2014 at 6:06 PM, Ralph Goers <
>>>>> ralph.go...@dslextreme.com> wrote:
>>>>>
>>>>>> Hmm. It seems I am going to have to do something to force the
>>>>>> registration as the custom level class hasn’t been constructed before the
>>>>>> levels are referenced in the configuration.
>>>>>>
>>>>>> Ralph
>>>>>>
>>>>>> On Jan 25, 2014, at 3:43 PM, Ralph Goers <ralph.go...@dslextreme.com>
>>>>>> wrote:
>>>>>>
>>>>>> In the constructor each of them calls Levels.addLevel(this).
>>>>>>
>>>>>> Ralph
>>>>>>
>>>>>> On Jan 25, 2014, at 2:21 PM, Remko Popma <remko.po...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>> Interesting! So, users would add custom levels by creating a new enum
>>>>>> that implements the Level interface? How does the new enum get 
>>>>>> registered?
>>>>>> In config or in code?
>>>>>>
>>>>>> Just trying to understand how it works...
>>>>>>
>>>>>> (With Nick's class I understood how that would work: users would
>>>>>> extend the Level class and pass an instance of that class to the
>>>>>> Logger.log() methods; in config they could specify the new Level name, 
>>>>>> and
>>>>>> the Level.toLevel(String, Level) method would find the custom instance 
>>>>>> in a
>>>>>> static HashMap in the Level superclass.)
>>>>>>
>>>>>> On Sunday, January 26, 2014, 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
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Cheers,
>>>>> Paul
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>

Reply via email to