How to (programmatically, without xml config) configure multiple loggers with Log4Net? I need them to write to different files.
Asked
Active
Viewed 4.1k times
4 Answers
46
This thread at the log4net Dashboard details an approach.
To summarize a little, hopefully without ripping off too much code:
using log4net;
using log4net.Appender;
using log4net.Layout;
using log4net.Repository.Hierarchy;
// Set the level for a named logger
public static void SetLevel(string loggerName, string levelName)
{
ILog log = LogManager.GetLogger(loggerName);
Logger l = (Logger)log.Logger;
l.Level = l.Hierarchy.LevelMap[levelName];
}
// Add an appender to a logger
public static void AddAppender(string loggerName, IAppender appender)
{
ILog log = LogManager.GetLogger(loggerName);
Logger l = (Logger)log.Logger;
l.AddAppender(appender);
}
// Create a new file appender
public static IAppender CreateFileAppender(string name, string fileName)
{
FileAppender appender = new
FileAppender();
appender.Name = name;
appender.File = fileName;
appender.AppendToFile = true;
PatternLayout layout = new PatternLayout();
layout.ConversionPattern = "%d [%t] %-5p %c [%x] - %m%n";
layout.ActivateOptions();
appender.Layout = layout;
appender.ActivateOptions();
return appender;
}
// In order to set the level for a logger and add an appender reference you
// can then use the following calls:
SetLevel("Log4net.MainForm", "ALL");
AddAppender("Log4net.MainForm", CreateFileAppender("appenderName", "fileName.log"));
// repeat as desired

Blair Conrad
- 233,004
- 25
- 132
- 111
-
I've taken this approach for one of my assemblies, rather than using the XML configuration approach. While the file does get generated, for some reason the ILog logging-related methods don't write anything to the files. Is there a method to call to make the new appender take effect? I haven't found anything like this, yet... – Dave Mar 26 '12 at 15:34
-
8@Dave: I had the same problem and solved it by appending `l.Repository.Configured = true;` to `AddAppender`. – Stephan Apr 20 '12 at 10:55
-
@Stephan thanks, I believe that's exactly what I had to do to make it work as well. :) – Dave Apr 23 '12 at 22:26
-
1Link appears to be dead. Any chance the discussion is stored somewhere else? – MonkeyWrench Jun 09 '15 at 19:41
-
1@MonkeyWrench: I found it [here](http://mail-archives.apache.org/mod_mbox/logging-log4net-user/200602.mbox/%3CDDEB64C8619AC64DBC074208B046611C769745@kronos.neoworks.co.uk%3E). – InteXX Sep 15 '15 at 02:30
3
using System;
using Com.Foo;
using System.Collections.Generic;
using System.Text;
using log4net.Config;
using log4net;
using log4net.Appender;
using log4net.Layout;
using log4net.Repository.Hierarchy;
public class MyApp
{
public static void SetLevel(string loggerName, string levelName)
{
ILog log = LogManager.GetLogger(loggerName);
Logger l = (Logger)log.Logger;
l.Level = l.Hierarchy.LevelMap[levelName];
}
// Add an appender to a logger
public static void AddAppender(string loggerName, IAppender appender)
{
ILog log = LogManager.GetLogger(loggerName);
Logger l = (Logger)log.Logger;
l.AddAppender(appender);
}
// Add an appender to a logger
public static void AddAppender2(ILog log, IAppender appender)
{
// ILog log = LogManager.GetLogger(loggerName);
Logger l = (Logger)log.Logger;
l.AddAppender(appender);
}
// Create a new file appender
public static IAppender CreateFileAppender(string name, string fileName)
{
FileAppender appender = new
FileAppender();
appender.Name = name;
appender.File = fileName;
appender.AppendToFile = true;
PatternLayout layout = new PatternLayout();
layout.ConversionPattern = "%d [%t] %-5p %c [%logger] - %m%n";
layout.ActivateOptions();
appender.Layout = layout;
appender.ActivateOptions();
return appender;
}
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));
static void Main(string[] args)
{
BasicConfigurator.Configure();
SetLevel("Log4net.MainForm", "ALL");
AddAppender2(log, CreateFileAppender("appenderName", "fileName.log"));
log.Info("Entering application.");
Console.WriteLine("starting.........");
log.Info("Entering application.");
Bar bar = new Bar();
bar.DoIt();
Console.WriteLine("starting.........");
log.Error("Exiting application.");
Console.WriteLine("starting.........");
}
}
namespace Com.Foo
{
public class Bar
{
private static readonly ILog log = LogManager.GetLogger(typeof(Bar));
public void DoIt()
{
log.Debug("Did it again!");
}
}
}

Narottam Goyal
- 3,534
- 27
- 26
-
this one is working fine,for this atleast log4jNet dll version2.0 is required. – Narottam Goyal Jun 18 '12 at 09:56
3
I Hope this helps, it configures a simple console logger.
static void Main(string[] args)
{
const string logLayoutPattern =
"[%date %timestamp][%level] %message %newline" +
"Domain: %appdomain, User: %username %identity %newline" +
"%stacktracedetail{10} %newline" +
"%exception %newline";
var wrapperLogger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
var logger = (Logger) wrapperLogger.Logger;
logger.Hierarchy.Root.Level = Level.All;
var consoleAppender = new ConsoleAppender
{
Name = "ConsoleAppender",
Layout = new PatternLayout(logLayoutPattern)
};
logger.Hierarchy.Root.AddAppender(consoleAppender);
logger.Hierarchy.Configured = true;
wrapperLogger.Debug("Hello");
Console.ReadKey();
}

G.Y
- 6,042
- 2
- 37
- 54
0
I mixed together the code from Blair Conrad's answer and the code from Philipp M on this post:
I compiled the result into a dll that I reference in my projects and call like this, usually on the first line of the main program:
public static Log = new Log4NetWrapper.LogWrapper().Setup(@"c:\myLog.log", "TestLog");
Here is the code in the DLL:
public class LogWrapper
{
public ILog Setup(string logFilePath, string logName, string maxFileSize = "10MB")
{
var patternLayout = new PatternLayout();
patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
patternLayout.ActivateOptions();
var roller = new RollingFileAppender();
roller.AppendToFile = true;
roller.File = logFilePath;
roller.Layout = patternLayout;
roller.MaxSizeRollBackups = 5;
roller.MaximumFileSize = maxFileSize;
roller.RollingStyle = RollingFileAppender.RollingMode.Size;
roller.StaticLogFileName = true;
roller.ActivateOptions();
//hierarchy.Root.AddAppender(roller);
var memory = new MemoryAppender();
memory.ActivateOptions();
ILog log = LogManager.GetLogger(logName);
var l = (Logger)log.Logger;
l.AddAppender(roller);
l.AddAppender(memory);
l.Level = l.Hierarchy.LevelMap["Debug"];
l.Repository.Configured = true;
return log;
}
}
One could of course add parameters as needed to the constructor or create overrides.

pasx
- 2,718
- 1
- 34
- 26
-
Sadly, I have found that although this is working fine in one of my project, in another one logging suddenly stopped working unless the code runs within the visual studio hosting process. I spent a lot of time on it and yet I have no idea why. So i must agree with a comment about log4net from another post. Log4Net is difficult to use and simply not reliable ): – pasx Sep 14 '18 at 14:46