1

Я использую Log4Net для ведения журнала. Когда приложение запускается, я вызываюlog4net.Config.XmlConfigurator.Configure() занимает слишком много времени

log4net.Config.XmlConfigurator.Configure();

Но эта линия занимает 15 секунд. Я делаю что-то неправильно? Или это нормально?

Я разрабатываю ASP.NET MVC, использую Unity для инъекции зависимостей.

В начале приложения, вызвать функцию Загрузчик Инициализировать

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

В функции Загрузчик Initialize, я зарегистрировать тип Илог.

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

В начале функции GetLogger я вызываю функцию CONFIGURE

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> 
+0

приостановить приложение, когда это половина пути через (скажем 7 секунд 15 всего) и посмотреть на трассировку стека (из всех потоков, если основной поток ждет), чтобы увидеть, что его ждет или делает. – wal

+0

Я пробовал ваш совет, но это не помогло. Процесс ждет там, и я думаю, что он делает что-то внутреннее. – adyusuf

+0

Можете ли вы показать нам свой файл конфигурации? –

ответ

2

15 секунд звучит как (соединение) тайм-аут, я считаю, таймаут по умолчанию 15 секунд.

У меня была аналогичная проблема один раз, и оказалось, что CLR попыталась проверить подпись аутентификации в момент загрузки, чтобы создать доказательства издателя для сборки. Я не уверен в деталях, но в разделе сборки есть элемент конфигурации с именем «generatePublisherEvidence», где его можно отключить. Вы должны проверить, хотите ли вы это сделать. И каковы последствия для этого. Если вы используете .Net 4 (или больше), это не должно влиять на время загрузки.

Для веб-приложений этот параметр нельзя установить в приложениях web.config. Он должен быть установлен в aspnet.config в каталоге .Net framework.

+0

Требуется не ровно 15 секунд, но 14,3. Я думаю, что это не таймаут. Хотя, как вы догадались, я использую .Net 4, я попробовал настройку «generatePublisherEvidence», но это тоже не помогло. – adyusuf

+0

Обратите внимание на то, что если вы настроили приложение базы данных в своем файле конфигурации, log4net попытается подключиться, даже если вы не используете этот appender. –

0

Когда вы пытаетесь вызвать следующее заявление

log4net.Config.XmlConfigurator.Configure(); 

система попытается проверить данную строку подключения к базе данных. Здесь проблема заключается в том, что ваша строка соединения может не соединяться и пытается подключиться, пока не будет задан тайм-аут.

Убедитесь в том, что указанная вами строка подключения действительна или нет.

http://techxposer.com/2017/08/08/log4net-config-xmlconfigurator-configure-taking-too-much-time/

Смежные вопросы