Nathan Foss
Nathan Foss

Reputation: 680

Log4Net Properties are always false (probably not initialized)

I've been using Log4Net to log to a database and it seems simple enough, but when I debug it I'm finding that all of the logging modes are still false.

I've tried to implement the solutions from here, here, and here but none of them are working for me.

All of them say basically the same things.. either I need

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "filepath", Watch = true)]

in my AsseblyInfo.cs or that I could use

log4net.Config.XmlConfigurator.Configure(new FileInfo("filepath"));

before I call log4net.LogManager.GetLoggers()

I've tried both of these, moved them around to various places, put them in the startup project, put them in Application_Start() but none of them have had any affect.

Here's my log4net.config file

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
  </appSettings>
  <system.diagnostics>
    <trace autoflush="true">
      <listeners>
        <add
          name="textWriterTraceListener"
          type="System.Diagnostics.TextWriterTraceListener"
          initializeData="C:\Projects\log4net.txt" />
      </listeners>
    </trace>
  </system.diagnostics>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="ADOAppender" />
      <appender-ref ref="FileAppender" />
    </root>
    <appender name="FileAppender" type="log4net.Appender.ConsoleAppender">
      <file value="C:\Projects\Log.txt"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date{ABSOLUTE} [%thread] %level - %message%newline%exception"/>
      </layout>
    </appender>
    <appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data"/>
      <connectionString value="XXXXXXX"/>
      <commandText value="dbo.sp_CreateErrorLog" />
      <commandType value="StoredProcedure" />
      <parameter>
        <parameterName value="@Date"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <parameter>
        <parameterName value="@Thread"/>
        <dbType value="String"/>
        <size value="255"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Level"/>
        <dbType value="String"/>
        <size value="50"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Logger"/>
        <dbType value="String"/>
        <size value="255"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@User" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{log4net:HostName}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Message"/>
        <dbType value="String"/>
        <size value="4000"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Exception"/>
        <dbType value="String"/>
        <size value="2000"/>
        <layout type="log4net.Layout.ExceptionLayout"/>
      </parameter>
    </appender>
  </log4net>
</configuration>

And my Class code:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "../log4net.config", Watch = true)]

namespace ...
{
    public class LogService : ILogService
    {

        private readonly log4net.ILog _log;

        public LogService()
        {
            log4net.Config.XmlConfigurator.Configure(new FileInfo("../log4net.config"));
            _log = log4net.LogManager.GetLogger
        (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        }

    //more stuff
    }
}

Can anyone see something that I'm missing? I'm stumped.

Upvotes: 1

Views: 1285

Answers (1)

Nathan Foss
Nathan Foss

Reputation: 680

The reason my particular program was behaving so strangely is because I was using an API to call a Logging Service which used log4net.

I simply had to move the log4net.config file to the root of the API and call it by using

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

This is because Log4Net looks in the root directory of the initial call which in my case was different than the directory where I was implementing Log4Net.

Upvotes: 1

Related Questions