AssemblyInfo 中的 Log4Net 配置加载

Log4Net configuration loading in AssemblyInfo

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

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

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

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

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

有什么想法吗?

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

我有这样的程序集:

Job.exe -> Shared.dll

在 Shared.dll 中,我有一个调用 LogManager.GetLogger() 的日志记录服务。 看来,log4net 程序集属性需要在第一个调用LogManager.GetLogger() 的程序集中。当我第一次从 Job.exe 调用 GetLogger() 时,即使 Shared.dll.

中没有 log4net 程序集属性,Log4Net 也会正确初始化

还在 docs 中找到了这个:

Using attributes can be a clearer method for defining where the application's configuration will be loaded from. However it is worth noting that attributes are purely passive. They are information only. Therefore if you use configuration attributes you must invoke log4net to allow it to read the attributes. A simple call to LogManager.GetLogger will cause the attributes on the calling assembly to be read and processed. Therefore it is imperative to make a logging call as early as possible during the application start-up, and certainly before any external assemblies have been loaded and invoked.

如果您使用此方法配置 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>