【问题标题】:Log4Net configuration loading in AssemblyInfo在 AssemblyInfo 中加载 Log4Net 配置
【发布时间】:2020-12-22 17:02:36
【问题描述】:

我遇到了一个奇怪的问题。

在一个解决方案中,我有一个共享的程序集信息文件(解决方案文件)并将其与常规 AssemblyInfo.cs 链接到我的项目中。属性设置为构建。 所有项目之间共享的属性都在 SharedAssemblyInfo.cs 文件中。特定于项目的属性在 AssemblyInfo.cs 中。

现在在配置 log4net 时,只有在 SharedAssemblyInfo.cs 中放置 log4net 属性时才会读取配置文件。当我将它放入 AssemblyInfo.cs 时,log4net 不会初始化。

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

这对我来说毫无意义。如果它只能在 AssemblyInfo.cs 中工作,我会以某种方式理解。以为可能是编译顺序或文件包含在 csproj 文件中的顺序,但这似乎无关紧要。

有什么想法吗?

【问题讨论】:

    标签: c# log4net assemblyinfo


    【解决方案1】:

    刚刚找到了该行为的根本原因。

    我有这样的程序集:

    Job.exe -> Shared.dll

    在 Shared.dll 中,我有一个调用 LogManager.GetLogger() 的日志记录服务。 看来,log4net 程序集属性需要在首先调用LogManager.GetLogger() 的程序集中。当我第一次从 Job.exe 调用 GetLogger() 时,即使 Shared.dll 中没有 log4net 程序集属性,Log4Net 也会正确初始化。

    docs也发现了这个:

    使用属性可以更清晰地定义应用程序的配置将从何处加载。然而值得注意的是,属性纯粹是被动的。它们只是信息。因此,如果您使用配置属性,您必须调用 log4net 以允许它读取属性。对 LogManager.GetLogger 的简单调用将导致读取和处理调用程序集上的属性。 因此,必须在应用程序启动期间尽早进行日志调用,并且肯定是在加载和调用任何外部程序集之前。

    如果您使用此方法配置 Log4Net,则在从条目程序集以外的程序集获取记录器时会遇到相同的问题。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
      </configSections>
    
      <log4net configSource="log4net.config" />
      
      <startup> 
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
      </startup>
    </configuration>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多