Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use log4net with Dependency Injection

I'm trying to figure out what the right patter and usage of log4net is with a dependency injection framework.

Log4Net uses the ILog interface but requires me to call

LogManager.GetLogger(Reflection.MethodBase.GetCurrentMethod().DeclaringType) 

in each class or method where I need to log information. This seems to go against IoC principles and couples me to using Log4Net.

Should I somehow put in another layer of abstraction somewhere?

Also, I need to log custom properties like the current user name like this:

log4net.ThreadContext.Properties["userName"] = ApplicationCache.CurrentUserName; 

How can I encapsulate this so that I don't have to remember to do it everytime and still maintain the current method that is logging. should I do something like this or am I totally missing the mark?

public static class Logger {     public static void LogException(Type declaringType, string message, Exception ex)     {         log4net.ThreadContext.Properties["userName"] = ApplicationCache.CurrentUserName;         ILog log = LogManager.GetLogger(declaringType);         log.Error(message, ex);     } } 
like image 399
Micah Avatar asked Jun 02 '09 17:06

Micah


People also ask

What is log4net in API?

Log4Net is a . NET logging framework maintained by Apache, based on their popular JAVA logging framework Log4j. Traditionally, Log4Net was one of the easiest ways to start logging to a file, database, or even an email on .

Where is log4net used?

log4net is a tool to help the programmer output log statements to a variety of output targets. In case of problems with an application, it is helpful to enable logging so that the problem can be located. With log4net it is possible to enable logging at runtime without modifying the application binary.

What is log4net in asp net?

Log4Net is a framework for implementing logging mechanisms. It is an open source framework. Log4net provides a simple mechanism for logging information to a variety of sources. Information is logged via one or more loggers.


1 Answers

I think you're not seeing the forest for the trees here. ILog and LogManager are a lightweight façade almost 1:1 equivalent to Apache commons-logging, and do not actually couple your code to the remainder of log4net.

<rant>
I've also found that almost always when someone creates a MyCompanyLogger wrapper around log4net they miss the point badly and will either lose important and useful capabilities of the framework, throw away useful information, lose the performance gains possible using even the simplified ILog interface, or all of the above. In other words, wrapping log4net to avoid coupling to it is an anti-pattern.
</rant>

If you feel the need to inject it, make your logger instance accessible via a property to enable injection but create a default instance the old-fashioned way.

As for including contextual state in every log message, you need to add a global property whose ToString() resolves to what you're looking for. As an example, for the current heap size:

public class TotalMemoryProperty {     public override string ToString()     {         return GC.GetTotalMemory(false).ToString();     } } 

Then to plug it in during startup:

GlobalContext.Properties["TotalMemory"] = new TotalMemoryProperty(); 
like image 94
Jeffrey Hantin Avatar answered Oct 04 '22 04:10

Jeffrey Hantin