0

Apologies for another log4net configuration question. I have a referenced library that has this method:

public static ILog Logger = LogManager.GetLogger(typeof(MyClass));
public void InitializeLog()
{
    XmlConfigurator.Configure(new FileInfo("log4net.xml"));
    Logger.Info("Starting");
}

In the project that uses this DLL, I have the log4net.xml at the root level of the project. It looks like this:

<log4net>
  <logger name="NHibernate">
    <level value="DEBUG" />
  </logger>
  <logger name="NHibernate.SQL">
    <level value="DEBUG" />
  </logger>
  <appender name="Console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date %level - %message%newline%newline" />
    </layout>
  </appender>

  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="C:\log\project.log" />
    <appendToFile value="true" />
    <maximumFileSize value="10000KB" />
    <maxSizeRollBackups value="5" />
    <layout type="log4net.Layout.PatternLayout">
      <footer value ="&#13;&#10;"/>
      <conversionPattern value="%date %level - %message%newline%newline" />
    </layout>
  </appender>

  <root>
    <level value="DEBUG" />
    <appender-ref ref="RollingFile" />
    <appender-ref ref="Console" />
  </root>
</log4net>

The project calls InitializeLog() before it ever tries to log anything. However, it won't even log the "Starting" message at the beginning. When I debug the method, in the Logger object I see Configured = false. I have a feeling it has something to do with the path to the xml file, because it works fine in a project that uses this library as project reference instead of an external one (not an option here.) Thoughts as to why the configuration fails.?

allie
  • 369
  • 1
  • 15

1 Answers1

0

log4net search config in current folder. You need to specify full path to config file:

ASP.NET application

    protected void Application_Start()
    {
        ...
        string l4net = Server.MapPath("~/log4net.config");
        log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(l4net));
    }

WinForm or Console application:

  1. In Solution Explorer right click on log4net.config, select Properties and set Copy to Output Directory - Copy if newer
  2. Use full path to Output Directory (you can call your exe from another folder)

    static void Main(string[] args)
    {
        var appPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(appPath));
    }
    

Content of my log4net.config:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="osai.log" />
      <appendToFile value="true" />
      <encoding value="utf-8" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <maximumFileSize value="50MB" />
      <immediateFlush value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="--- Application start ---&#xD;&#xA;" />
        <param name="Footer" value="--- Application stop ---&#xD;&#xA;" />
        <conversionPattern value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>
</configuration>
Alexey Obukhov
  • 834
  • 9
  • 18