My idea was _not_ to add byte codes to the Logger interface, it was to add code 
to a user's class that wraps a logger. 

G

-------- Original message --------
From: Remko Popma <remko.po...@gmail.com> 
Date:01/25/2014  21:51  (GMT-05:00) 
To: Log4J Developers List <log4j-dev@logging.apache.org> 
Subject: Re: Enums and Custom Levels 

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