Click here to Skip to main content
15,860,943 members
Articles / Programming Languages / C#
Article

A Brief Introduction to the log4net logging library, using C#

Rate me:
Please Sign up or sign in to vote.
4.46/5 (104 votes)
10 Sep 20044 min read 616.1K   11.4K   158   41
An article describing the basic use of the log4net library.

What is log4net

Log4net is an open source library that allows .NET applications to log output to a variety of sources (e.g., The console, SMTP or files). Log4net is a port of the popular log4J library used in Java. Full details of log4net can be found at its project homepage.

In this article, I will give an overview of how the library works and examples of a few of the different logging options.

Downloading the library

The log4net library can be downloaded from the project homepage. The latest distribution comes with versions of log4net for MONO, .NET 1.0 and 1.1, and .NET Compact Framework.

What does log4net provide?

Log4net provides a simple mechanism for logging information to a variety of sources. Information is logged via one or more loggers. These loggers provide 5 levels of logging:

  1. Debug
  2. Information
  3. Warnings
  4. Error
  5. Fatal

Hopefully (!!) the amount of logging performed by each level will decrease going down this list (we want more debug information than fatal errors!). The level of logging on a particular logger can be specified, hence during development, all 5 levels of logging can be output to aid development. When your application is deployed, you may decide to only output level 5 – Fatal errors to your log files. It's up to you and it's all easily configurable.

So, where does the logging information go? Well, logging information goes to what is called an Appender. An appender is basically a destination that the logging information will go to. In this article, I will give examples of the ConsoleAppender and the FileAppender. Many other appenders exist to allow data to be logged to databases, email, net broadcasts etc. You are not limited to only using one appender, you can have as many appenders configured for use as you want. Appender configuration is performed outside of code in XML files, so as we shall see later, it is a simple matter to change your logging configuration.

OK, so we know that we can use a logger to output data to a number of appenders, but what format will the information be logged as? Well, log4net has a number of layouts that can be used for each appender. These layouts specify whether the logs are produced as simple textual data or as XML files, or whether they have timestamps on them etc.

Let's get logging

OK, I'm sure you've read enough about logging now, and want to see some code and see how it all works. Well, here goes. Our first (incredibly simple) example program (LogTest.exe) is shown below:

C#
using log4net;
using log4net.Config;

public class LogTest
{
    private static readonly ILog logger = 
           LogManager.GetLogger(typeof(LogTest));
    
    static void Main(string[] args)
    {
        BasicConfigurator.Configure();
        
        logger.Debug("Here is a debug log.");
        logger.Info("... and an Info log.");
        logger.Warn("... and a warning.");
        logger.Error("... and an error.");
        logger.Fatal("... and a fatal error.");
    }
}

You can see that there are a few interesting lines within this small application. The first of these is where we create a Logger.

C#
private static readonly ILog logger = 
          LogManager.GetLogger(typeof(LogTest));

This creates a logger for the class LogTest. You don't have to use a different logger for each class you have, you can use different loggers for different sections or packages within your code. The class of the logger is output to the log so you know where any logged information has come from.

The next interesting line is:

C#
BasicConfigurator.Configure();

This method initializes the log4net system to use a simple Console appender. Using this allows us to quickly see how log4net works without having to set up different appenders. Don't worry however, setting up appenders isn't difficult and we'll look at that in a minute.

Finally, if you run the application, you can see the different levels of logging output that are performed - in this case, to the console:

0 [2436] DEBUG LogTest  - Here is a debug log.
31 [2436] INFO LogTest  - ... and an Info log.
31 [2436] WARN LogTest  - ... and a warning.
31 [2436] ERROR LogTest  - ... and an error.
31 [2436] FATAL LogTest  - ... and a fatal error.

Specifying the Appender

Let's now change the test application so that it loads the log4net configuration information from a “.config” file. This is done by removing the BasicConfigurator and using a DOMConfigurator as is shown in the sample application LogTest2.

C#
using log4net;
using log4net.Config;

public class LogTest2
{
    private static readonly ILog logger = 
          LogManager.GetLogger(typeof(LogTest2));
    
    static LogTest2()
    {
        DOMConfigurator.Configure();
    }

    static void Main(string[] args)
    {
        logger.Debug("Here is a debug log.");
        logger.Info("... and an Info log.");
        logger.Warn("... and a warning.");
        logger.Error("... and an error.");
        logger.Fatal("... and a fatal error.");
    }
}

Now that we are using a DOMConfigurator, we need to specify our appenders and layouts. This is done in the application's .config file, “LogTest2.exe.config”.

XML
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="log4net" 
           type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>
    <log4net>
        <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <param name="File" value="LogTest2.txt" />
            <param name="AppendToFile" value="true" />
            <layout type="log4net.Layout.PatternLayout">
                <param name="Header" value="[Header]\r\n" />
                <param name="Footer" value="[Footer]\r\n" />
                <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
            </layout>
        </appender>
        
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
            <layout type="log4net.Layout.PatternLayout">
                <param name="Header" value="[Header]\r\n" />
                <param name="Footer" value="[Footer]\r\n" />
                <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
            </layout>
        </appender>

        <root>
            <level value="INFO" />
            <appender-ref ref="LogFileAppender" />
            <appender-ref ref="ConsoleAppender" />
        </root>
    </log4net>
</configuration>

Within this XML file, you can see that there are two appenders specified, LogFileAppender and ConsoleAppender. We also have a root appender. This specifies what appenders we are using and also what level of output we want to see in our logs – in this case, everything from INFO onwards (i.e., everything except DEBUG). The LogFileAppender specifies which file to use and whether to append onto the end of an existing file or not. Both appenders use a common layout that specifies what information is output to the logs. We can see that the date (%d), time (%t), logging level (%p), the name of the logger (%c) and the message (%m) are output.

If you now run application LogTest2, the following output is shown on the console:

2004-09-10 12:53:48,062 [1216] INFO  LogTest2  - ... and an Info log.
2004-09-10 12:53:48,078 [1216] WARN  LogTest2 - ... and a warning.
2004-09-10 12:53:48,078 [1216] ERROR LogTest2 - ... and an error.
2004-09-10 12:53:48,078 [1216] FATAL LogTest2 - ... and a fatal error.

If you have a look at the file “LogTest2.txt”, you will see that it contains the same information.

Well, that's a brief overview of what log4net can do, and we've only really scratched the surface here. Log4net provides many other features and I'd recommend grabbing hold of a copy to try them out.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United Kingdom United Kingdom
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionCan you let me know if log4net.dll file is statically linked or dynamically linked Pin
Member 1216838919-Jan-16 19:08
Member 1216838919-Jan-16 19:08 
SuggestionDOMConfigurator Deprecation Pin
amon41amarth4-May-15 5:07
amon41amarth4-May-15 5:07 
QuestionReally great article David Salter Pin
sacratesj29-Oct-14 2:55
sacratesj29-Oct-14 2:55 
QuestionLicense Model Pin
Member 40483933-Sep-14 20:12
Member 40483933-Sep-14 20:12 
QuestionMy vote of 5 Pin
tuanv2t18-Aug-14 0:47
tuanv2t18-Aug-14 0:47 
QuestionHow to log stacktrace of an exception? Pin
Prasanna Krishnaswamy17-Jul-14 4:23
professionalPrasanna Krishnaswamy17-Jul-14 4:23 
General5 stars Pin
Paul Sincai30-Jun-14 22:30
Paul Sincai30-Jun-14 22:30 
GeneralMy vote of 3 Pin
Member 1072483715-Apr-14 5:10
Member 1072483715-Apr-14 5:10 
QuestionLog4net Intro Pin
GazYad23-Nov-13 5:20
GazYad23-Nov-13 5:20 
GeneralMy vote of 5 Pin
Mazen el Senih11-May-13 7:15
professionalMazen el Senih11-May-13 7:15 
GeneralMy vote of 3 Pin
Ehsan yazdani rad7-May-13 0:40
Ehsan yazdani rad7-May-13 0:40 
nice but need more work. special with log repository like service and sql
GeneralMy vote of 4 Pin
Sheila Deskins4-Jan-13 8:13
Sheila Deskins4-Jan-13 8:13 
QuestionMultiple Instances of same application with different log files Pin
himanshub197823-Aug-12 18:00
himanshub197823-Aug-12 18:00 
QuestionSend email for only Error level provider in log4net Pin
PankajSaha14-Feb-12 23:39
PankajSaha14-Feb-12 23:39 
QuestionIs there a way to specify different log destination? Pin
Member 31191311-Jun-11 11:50
Member 31191311-Jun-11 11:50 
GeneralMy vote of 4 Pin
Pravin Patil, Mumbai24-Jan-11 4:25
Pravin Patil, Mumbai24-Jan-11 4:25 
GeneralGood reference article Pin
Donsw24-Oct-10 10:26
Donsw24-Oct-10 10:26 
GeneralVery helpful Pin
nuprin_X19-Mar-10 14:28
nuprin_X19-Mar-10 14:28 
GeneralAnother good link for setting and implement log4net Pin
MD.Tanvir Anowar15-Nov-09 16:15
MD.Tanvir Anowar15-Nov-09 16:15 
GeneralNice Pin
guzufeng25-Sep-09 5:01
guzufeng25-Sep-09 5:01 
Questionlog file name as current Date-Time Pin
Andy Rama12-May-09 3:17
Andy Rama12-May-09 3:17 
AnswerRe: log file name as current Date-Time Pin
Chetan Ranpariya29-Apr-10 19:37
Chetan Ranpariya29-Apr-10 19:37 
GeneralThis was very helpful Pin
ramone.hamilton25-Mar-09 20:42
ramone.hamilton25-Mar-09 20:42 
Generalnice starting point Pin
Radim Köhler6-Oct-08 21:25
Radim Köhler6-Oct-08 21:25 
QuestionHow to configure a config file to log to multiple files Pin
GambLL28-Jul-08 9:07
GambLL28-Jul-08 9:07 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.