2012-04-27 310 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