I have looked through the dev list to see if this has come up, but I haven't seen 
anything so far. I have been using log4j on a few projects, and like the 
configurability and extensibility it provides - very nice - thankyou for the excellent 
tool.

However, there seems to be one part of the architecture where I have run into 
limitations, and would like to submit a feature request. Log4j provides a mechanism to 
register 'ObjectRenderer(s)' in the configuration. This is very handy since it allows 
you to log various types of objects that log4j would not natively understand by simply 
creating a new 'ObjectRenderer' class and including this in the log4j configuration 
(no other changes). This part is very nice. The problem I have run into is cases where 
I would like the set of 'ObjectRenderer(s)' to be different for various 'Layout(s)' 
used at the same time. There does not appear to be a way to do this.

The current assumption seems to be that there is one application global fundamental 
'String' mapping for each loggable object type. There seem to be many cases where you 
may want to object to be rendered differently in different contexts. Log4j gives you 
this flexibility in the relationship of 'Appender(s)' to 'Layout(s)', but for some 
reason did not extend this to the relationship between 'Layout(s)' and 
'ObjectRenderer(s)'.

One case where having different object renderers is useful is in a case where there 
are several things you can pull out of an object. One 'Appender' (or more correctly 
'Formatter') may log part of the info and another 'Appender' may log different info 
from the same object. In another case, two 'Layout(s)' may need the same info, but the 
string format may need to be different for each. I do not see a clean way to currently 
handle either of these cases.

My suggestion would be to add a new concept of 'ObjectRendererBundle(s)' which 
includes a set of 'ObjectRenderer(s)' that a 'Layout' will use. In the configuration, 
the 'Layout' can be assigned an 'ObjectRendererBundle' in a similar way that an 
'Appender' is assigned a 'Layout'. The 'Layout' class could include a couple of new 
methods something like 'setObjectRendererBundle' and 'getObjectRendererBundle' to 
access the set of object renders for the 'Layout'. There would probably be a default 
'ObjectRendererBundle' that was global as in the current case, but the 
'ObjectRenderer' model would be more extensible.

Are there any other thoughts or somments on this? Does this seem like a reasonable 
approach? Is this something that you are interested in including into 'log4j'?

-Lance Larsen

Reply via email to