[ 
https://issues.apache.org/jira/browse/LOG4NET-409?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13831049#comment-13831049
 ] 

Stefan Bodewig commented on LOG4NET-409:
----------------------------------------

Well, the major reason why you don't find generics in the codebase is that 
log4net is so old and so strict with backwards compatibility that generics had 
to be ruled out.  The log4net 1.2.13 release cut just this week ships with 
assemblies compiled for .NET 1.1 and is supposed to even compile on 1.0.  This 
no longer is an issue with the current svn trunk which will become 1.3.0 one 
day and will require .NET 2.0 as a minimum.

Leaving this aside, I must admit that you are describing a usecase I've never 
encountered so far.  I've never had any reason to restrict what types I wanted 
to send to my logger.  In fact I don't need the ability to log anything but 
strings (including strings created with format and a bunch of non-string 
parameters) or exceptions most of the time.  I tend to have exactly one logger 
per class and probably don't know what I'll be logging when I define the 
corresponding static field.

Could you please explain the real-world scenario where you'd use them and what 
you'd use them for?  I'm sure I must be missing an important point.

> Generics added to the Logger
> ----------------------------
>
>                 Key: LOG4NET-409
>                 URL: https://issues.apache.org/jira/browse/LOG4NET-409
>             Project: Log4net
>          Issue Type: Wish
>          Components: Core
>    Affects Versions: 1.3.0
>            Reporter: Ben
>              Labels: features
>
> Maybe this has been suggested before - if so sorry (I did do a search for it).
> I am fairly new to log4net and when I am using it, I was surprised to see 
> that the log methods take an object as a parameter.  Of course this made 
> sense after I found out that Object Renderers can be made to parse any type 
> of object.  I did wonder why Generics was not used.
> If I have an Object Renderer that knows how to log Orange objects then I 
> don't want to accidentally pass it an Apple object (or any other type of 
> object).
> So using Generics I would set up my logger as follows:
> private ILog<Orange> myOrangeLogger = 
> LogManager.GetLogger<Orange>("OrangeLogger");
> I have just made a special type of logger that can log oranges.  Instead of 
> accepting parameters of type object it accepts only strings and Oranges.  
> Behind the scenes the method
> LogManager.GetLogger<T>(string name) 
> would return a logger of type ILog<T>.
> The ILog<T> interface would have methods on it like:
> ILog<T>.Warn(string message);
> ILog<T>.Warn(T message);
> ILog<T>.Warn(string message, Exception ex);
> ILog<T>.Warn(T message, Exception ex);
> but would NOT have the method:
> ILog<T>.Warn(object message);
> So now if I tried to pass it an Apple object I would get a compile error 
> rather than the default behaviour for a logger which has been given an object 
> that has no special renderer (in fact I probably wouldn't even realise until 
> I went to look at the log files right?).  This would be much better and would 
> help to save me from embarrassing myself in front of my customers.
> This could be added in addition to the standard loggers which would still be 
> returned in the normal way using:
> LogManager.GetLogger(string name);
> If this has not already been suggested then I hope you like this idea.



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to