Thanks to everyone for their suggestions…
No single suggestion worked completely for me, but there were nuggets of information that were quite helpful!
I just spent a while figuring out what works for me, and this is the result…
We have a static utility class as follows, and I was able to add these ‘SetLevel<Level>’ methods to modify the one logging object we setup, to change the log levels on the fly.
There is still a log4net.conf file which defines all the usual things (log file location, appending rules, etc)
Here’s the code:
using log4net;
using log4net.Appender;
using log4net.Core;
using log4net.Repository.Hierarchy;
public static class LogUtility
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private static readonly Logger logger = log.Logger as Logger;
public static log4net.ILog GetLog()
{
return (log);
}
private static void SetLevel(Level level)
{
if (logger != null)
{
logger.Level = level;
}
}
public static void SetLevelDebug()
{
SetLevel(Level.Debug);
}
public static void SetLevelInfo()
{
SetLevel(Level.Info);
}
public static void SetLevelWarn()
{
SetLevel(Level.Warn);
}
public static void SetLevelError()
{
SetLevel(Level.Error);
}
public static void SetLevelFatal()
{
SetLevel(Level.Fatal);
}
public static void SetLevelOff()
{
SetLevel(Level.Off);
}
public static void SetLevelAll()
{
SetLevel(Level.All);
}
}
Here’s a code fragment that tests this:
LogUtility.SetLevelOff();
LogUtility.GetLog().Debug("After SetLevelOff() debug");
LogUtility.GetLog().Warn("After SetLevelOff() warn");
LogUtility.GetLog().Fatal("After SetLevelOff() fatal");
LogUtility.SetLevelInfo();
LogUtility.GetLog().Debug("After SetLevelInfo() debug");
LogUtility.GetLog().Warn("After SetLevelInfo() warn");
LogUtility.GetLog().Fatal("After SetLevelInfo() fatal");
LogUtility.SetLevelError();
LogUtility.GetLog().Debug("After SetLevelError() debug");
LogUtility.GetLog().Warn("After SetLevelError() warn");
LogUtility.GetLog().Fatal("After SetLevelError() fatal");
LogUtility.SetLevelWarn();
LogUtility.GetLog().Debug("After SetLevelWarn() debug");
LogUtility.GetLog().Warn("After SetLevelWarn() warn");
LogUtility.GetLog().Fatal("After SetLevelWarn() fatal");
LogUtility.SetLevelAll();
LogUtility.GetLog().Debug("After SetLevelALL() debug");
LogUtility.GetLog().Warn("After SetLevelALL() warn");
LogUtility.GetLog().Fatal("After SetLevelALL() fatal");
And, this is what the log file output looks like:
3: erose-xp5: Feb 11 2009 15:11:07.803 -05:00: %testLog-WARN-After SetLevelInfo() warn
4: erose-xp5: Feb 11 2009 15:11:07.803 -05:00: %testLog-FATAL-After SetLevelInfo() fatal
5: erose-xp5: Feb 11 2009 15:11:07.803 -05:00: %testLog-FATAL-After SetLevelError() fatal
6: erose-xp5: Feb 11 2009 15:11:07.803 -05:00: %testLog-WARN-After SetLevelWarn() warn
7: erose-xp5: Feb 11 2009 15:11:07.803 -05:00: %testLog-FATAL-After SetLevelWarn() fatal
8: erose-xp5: Feb 11 2009 15:11:07.803 -05:00: %testLog-DEBUG-After SetLevelALL() debug
9: erose-xp5: Feb 11 2009 15:11:07.803 -05:00: %testLog-WARN-After SetLevelALL() warn
10: erose-xp5: Feb 11 2009 15:11:07.803 -05:00: %testLog-FATAL-After SetLevelALL() fatal
So, it is possible, and does work!
Thanks again, everyone…!
-esr