簡體   English   中英

AssemblyInfo 中的 Log4Net 配置加載

[英]Log4Net configuration loading in AssemblyInfo

我面臨一個奇怪的問題。

在一個解決方案中,我有一個共享程序集信息文件(解決方案文件)並將其與常規 AssemblyInfo.cs 一起鏈接到我的項目中。 屬性設置為構建。 所有項目之間共享的屬性位於 SharedAssemblyInfo.cs 文件中。 特定於項目的屬性位於 AssemblyInfo.cs 中。

現在在配置 log.net 時,只有在將 log.net 屬性放入 SharedAssemblyInfo.cs 時才會讀取配置文件。 當我把它放入 AssemblyInfo.cs 時,log.net 不會初始化。

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

這對我來說毫無意義。 如果它只能在 AssemblyInfo.cs 中工作,我會以某種方式理解。 認為這可能是編譯順序或文件包含在 csproj 文件中的順序,但這似乎並不重要。

任何的想法?

裝配信息文件

剛剛找到了行為的根本原因。

我有這樣的程序集:

Job.exe -> Shared.dll

在 Shared.dll 中,我有一個調用LogManager.GetLogger( ) 的日志記錄服務。 看來,log.net 程序集屬性需要位於首先調用LogManager.GetLogger()的程序集中。 當我第一次從 Job.exe 調用GetLogger()時,即使 Shared.dll 中沒有Shared.dll程序集屬性,Log4Net 也會正確初始化。

文檔中也找到了這個:

使用屬性可以是一種更清晰的方法,用於定義將從何處加載應用程序的配置。 但是值得注意的是,屬性是純粹被動的。 它們只是信息。 因此,如果您使用配置屬性,則必須調用 log.net 以允許它讀取屬性。 對 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM