Ok, I found a solution. Should have stuck with it for a little while
longer... Turns out that I needed to see if any appenders are still
configured. In case anyone is looking for this in the future:

static private ILog GetCurrentLogger()
{
    ILog aLog = LogManager.GetLogger(new
StackTrace().GetFrame(2).GetMethod().DeclaringType.FullName);
    if
(((log4net.Repository.Hierarchy.Hierarchy)aLog.Logger.Repository).Root.A
ppenders.Count==0)
    {
        log4net.Config.DOMConfigurator.ConfigureAndWatch(new
FileInfo(HttpContext.Current.Server.MapPath("log4net.config")));
        if (aLog.IsDebugEnabled) aLog.Info("Detected a Log4Net
configuration file change");
    }
    return aLog;
} 

I'd bet my last buck that this isn't thread safe, and may not work in an
environment where log4net is using in a more advanced manner, but it
serves my requirements. Feedback and further insight on my
implementation is welcome.

-Josh

-----Original Message-----
From: Josh Kewley [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, November 30, 2004 5:56 PM
To: Log4NET User
Subject: ConfigureAndWatch and HttpContext

I'm having a problem where ConfigureAndWatch won't craps out when trying
to reload the configuration file after it's been modified. In my
global.asax.cs file, I have the following:

protected void Application_Start(Object sender, EventArgs e)
{
    DOMConfigurator.DOMConfigurator.ConfigureAndWatch(new
System.IO.FileInfo(Server.MapPath("log4net.config")));
    Logger.Info("Application Started");
}

The logger works fine until I change log4net.config, at which point it
writes out the footer content and then stops logging. When looking at
the log4Net internal logging, I see that the error being thrown is that
the HttpContext is not available during the DOMConfigurator's attempt to
reload itself from the log4net.config file. The HttpContext is used by a
helper class that determines the location of the log output file:

public class CustomWebLogFileAppender : log4net.Appender.FileAppender
{
    public override string File 
    {
        get{return base.File;}
        set{base.File = Web.WebEnvironment.LogDirectory + value;}
    }
}

It looks like this happens because the configuration reload takes place
when the file is touched, and not with subsequent web requests. Does
anyone have a suggestion as to how I might be able to determine if
log4net is configured so that I can reload it programmatically, if need
be? I'm thinking I'll do something like this:

public class Logger
{
    public static void Debug(string aMessage)
    {
        ILog aLog = GetCurrentLogger();
        if (aLog.IsDebugEnabled) aLog.Debug(aMessage);
    }
    static private ILog GetCurrentLogger()
    {
        if (<<The configuration isn't loaded>>)
            DOMConfigurator.ConfigureAndWatch(<<the config file>>);
        
        return LogManager.GetLogger(<<the type>>);
    }
}  

-Josh

Reply via email to