2012-04-27 212 views
1

我使用Log4Net進行日誌記錄。當應用程序啓動時,我打電話給log4net.Config.XmlConfigurator.Configure()時間太長

log4net.Config.XmlConfigurator.Configure();

但是這條線需要15秒才能完成。難道我做錯了什麼?或者這是正常的?

我正在開發與ASP.NET MVC,用於依賴注入的Unity。

在應用程序開始,我所說的引導程序初始化函數

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

在引導程序初始化函數,我註冊類型的ILog。

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

在GetLogger函數開始我所說的配置功能

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

編輯
--------------------- -------------------------------------------------- ----------

<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

暫停您的應用程序時,它是直通(比如說15共7秒)的一半,並在堆棧跟蹤看(所有線程的,如果主線程等待),看看它的等待或這樣做。 – wal 2012-04-27 12:43:05

+0

我試過了你的建議,但它沒有幫助。進程在那裏等待,我認爲它在內部做了一些事情。 – adyusuf 2012-05-02 06:36:18

+0

你能告訴我們你的配置文件嗎? – 2012-05-02 06:58:44

回答

2

15秒聽起來像(連接)超時,我相信默認的超時時間是15秒。

我曾經有過類似的問題,事實證明,CLR試圖在加載時驗證authenticode簽名以創建程序集的發佈者證據。 我不確定細節,但在組件部分中可以關閉一個名爲「generatePublisherEvidence」的配置元素。你應該檢查你是否想要這樣做。而對此的影響是什麼。 如果您使用.Net 4(或更高版本),這應該不會影響加載時間。

對於Web應用程序,無法在應用程序web.config中設置此設置。它應該在.Net框架目錄下的aspnet.config中設置。

+0

這不僅僅需要15秒,而是14秒。我認爲這不是暫停。雖然,正如你所猜測的,我使用.Net 4,但我嘗試了「generatePublisherEvidence」配置,但它也沒有幫助。 – adyusuf 2012-05-02 06:37:47

+0

需要注意的是,如果您在配置文件中配置了數據庫appender,即使您未使用該appender,log4net也會嘗試連接。 – 2017-08-15 15:16:39