Search code examples
asp.net-mvclog4netunity-containerlog4net-configuration

log4net.Config.XmlConfigurator.Configure() takes too long


I use Log4Net for logging. When the application starts, I call

log4net.Config.XmlConfigurator.Configure();

But this line takes 15 seconds to finish. Am I doing something wrong? Or is it normal?

I am developing with ASP.NET MVC, an use Unity for dependency injection.

At the application start, I call a Bootstrapper Initialise function

protected void Application_Start()
{
    IUnityContainer container = Bootstrapper.Initialise();
    ...
    ...
}

In the Bootstrapper Initialize function, I register the type ILog.

private static IUnityContainer BuildUnityContainer()
{
    var container = new UnityContainer();
    ...
    ...
    container.RegisterType<ILog>("", new ContainerControlledLifetimeManager(),
        new InjectionFactory(factory =>
        LogManager.GetLogger(typeof(HomeController).Assembly, connectionString)));
    ...
    ...
}

At the beginning of GetLogger function I call the configure function

public static ILog GetLogger(Assembly assembly, string connectionString)
{
    log4net.Config.XmlConfigurator.Configure();  //<----- it takes 15 seconds to finish
    ...
    ...
}  

EDIT
---------------------------------------------------------------------------------

<log4net>
  <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="0" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception],[UserId],[Operation],[EntityType],[EntityId],[IP],[Host],[SessionId],[LogGroup]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @UserId, @Operation, @EntityType, @EntityId, @IP, @Host, @SessionId, @LogGroup)" />
    <parameter>
      <parameterName value="@log_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="@log_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="@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>
    <parameter>
      <parameterName value="@UserId"/>
      <dbType value="Int32" />
      <layout type="log4net.Layout.RawPropertyLayout">
        <key value="UserId" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@IP"/>
      <dbType value="String" />
      <size value="25" />
      <layout type="log4net.Layout.RawPropertyLayout">
        <key value="IP" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Host"/>
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.RawPropertyLayout">
        <key value="Host" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@LogGroup"/>
      <dbType value="Int32" />
      <layout type="log4net.Layout.RawPropertyLayout">
        <key value="LogGroup" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Operation"/>
      <dbType value="Int32" />
      <layout type="log4net.Layout.RawPropertyLayout">
        <key value="Operation" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@EntityType"/>
      <dbType value="Int32" />
      <layout type="log4net.Layout.RawPropertyLayout">
        <key value="EntityType" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@EntityId"/>
      <dbType value="Int32" />
      <layout type="log4net.Layout.RawPropertyLayout">
        <key value="EntityId" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@SessionId"/>
      <dbType value="String" />
      <size value="88" />
      <layout type="log4net.Layout.RawPropertyLayout">
        <key value="SessionId" />
      </layout>
    </parameter>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="AdoNetAppender" />
  </root>
</log4net>

Solution

  • 15 Seconds sounds like a (connection) timeout, I believe the default timeout is 15 seconds.

    I had a similar problem once and it turned out to be The CLR tried to verify the authenticode signature at load time to create publisher evidence for an assembly. I am not sure about the details but there is a configuration element named "generatePublisherEvidence" in the assembly section where it can be turned off. You should check if you want to do this though. And what the implications for this are. If you are using .Net 4 (or greater) this should have no impact on load time.

    For web applications this setting cannot be set in the applications web.config. It should be set in the aspnet.config in the .Net framework directory.