You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-dev@logging.apache.org by "Stefan Bodewig (JIRA)" <ji...@apache.org> on 2013/11/24 22:00:35 UTC

[jira] [Commented] (LOG4NET-409) Generics added to the Logger

    [ 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)