2013-02-10 35 views
2

我有一個奇怪的現象:log4net的工作在本地開發面料精細,工人的角色還可以,但不是在Web角色

我配置了自定義log4net的Appender的寫入Azure Table中存儲。我有WorkerRole和WebRole。這兩個角色都使用osFamily =「3」(Windows Server 2012),我在這兩個版本中使用.NET 4.5,並使用ASP.NET MVC4作爲WebRole。所有配置都可以在本地正常工作 - 工作人員和Web角色都可以正確記錄。但是,當我部署到Azure時,只有「成功」角色日誌,webrole不會生成任何日誌(任何!),但它應該。

我已經在WebRole上配置了log4net以調試log4net調試數據並將其發送到跟蹤中以檢查某些問題,但它不發送錯誤/警告。它也不發送日誌消息。

這裏是通過log4net的調試生成的日誌(剝離敏感數據):

log4net的:log4net的組件[log4net的,版本= 1.2.11.0,文化=中性 公鑰= 669e0ddf0bb1aa2a]。加載自 [D:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root \ 59a01799 \ 5b6b1a2 \ assembly \ dl3 \ 8d97587f \ b9d49402_c202ce01 \ log4net.dll]。 (.NET運行庫[4.0.30319.18010]在Microsoft Windows NT 6.2.9200.0) log4net的:defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy] log4net的:創建庫 組裝[_my_referenced_assembly_,版本= 1.3.0.20282, 文化=中立,PublicKeyToken = null] log4net:程序集 [_my_referenced_assembly_,Version = 1.3.0.20282,Culture = neutral, PublicKeyToken = null]加載自 [D:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP .NET Files \ root \ 59a01799 \ 5b6b1a2 \ assembly \ dl3 \ 8cc98c20 \ 594c5b41_6f07ce01_my_referenced_assembly_.dll] log4net:Assembly [_my_referenced_assembly_,Version = 1.3.0.20282, Culture = neutral,PublicKeyToken = nu ll]沒有指定 RepositoryAttribute。 log4net:程序集 [_my_referenced_assembly_,Version = 1.3.0.20282,Culture = neutral, PublicKeyToken = null]使用存儲庫[log4net-default-repository]和 存儲庫類型[log4net.Repository.Hierarchy.Hierarchy] log4net: 創建存儲庫[使用類型 [log4net.Repository.Hierarchy.Hierarchy]加載 log4net的默認存儲庫] 「Microsoft.WindowsAzure.ServiceRuntime,版本= 1.8.0.0, 文化=中性公鑰= 31bf3856ad364e35」 獲得 「_some_setting_1_」 從ServiceRuntime: PASS(_my_value1_)。從ServiceRuntime獲取 「_some_setting_2_」:PASS(_my_value2_)。從ServiceRuntime獲取 「_some_setting_3_」:PASS(_my_value3_)。從 ServiceRuntime:PASS(_my_conn_string_)獲取 「Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString」。從ServiceRuntime獲取「_some_setting_4_」 :PASS(_my_value4_)。 log4net的:創建儲存庫 組裝[_my_WEB_assembly_,版本= 1.3.0.20283文化=中性, 公鑰=空] log4net的:裝配[_my_WEB_assembly_, 版本= 1.3.0.20283文化=中性公鑰=空]加載從 [ d:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \臨時ASP.NET 文件\根\ 59a01799 \ 5b6b1a2 \組件\ DL3 \ f695181f \ 98c73242_6f07ce01_my_WEB_assembly_.dll] log4net的:裝配[_my_WEB_assembly_,版本= 1.3.0.20283 , Culture = neutral,PublicKeyToken = null]沒有指定 RepositoryAttribute。log4net的:裝配[_my_WEB_assembly_, 版本= 1.3.0.20283文化=中性公鑰=空]使用 庫[log4net的 - 缺省 - 庫〕和存儲庫類型 [log4net.Repository.Hierarchy.Hierarchy] log4net的:儲存庫 [log4net的-default-repository]已存在,使用存儲庫類型 [log4net.Repository.Hierarchy.Hierarchy]從 獲取「acs:idps」ServiceRuntime:FAIL。從ConfigurationManager獲取「acs:idps」: PASS([my_value])。

這裏既是我的app.config(對於工人)和web.config文件(用於Web角色)的文件(我以防萬一還設置此爲WaIISHost.config,但結果還是一樣的樣本 - 完全靜音WebRole):

<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    ... 
    </configSections> 
... 
    <log4net> 
    <appender name="AzureTableStoreAppender" type="_MyAssembly_.Logging.AzureTableStorageAppender, MyAssembly"> 
    </appender> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="AzureTableStoreAppender" /> 
    </root> 
    </log4net> 
</configuration> 

我通過程序集級屬性配置log4net。因此,在工人的角色裝配我:

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

而在Web角色,我有:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)] 

正如我所說的,一切正常,當本地運行寫入表實體罰款。我的本地環境是Windows 8 Pro,在IIS8中運行IIS服務器(不是IIS Express)中的Web角色。我也嘗試將WebRole executionContext標記爲elevated,但仍然沒有任何反應。這就像log4net的黑洞。

我的自定義appender是在Web和Worker項目中引用的Class Library類型的單獨Assembly,.net Framework 4.5(完整)中定義的。如前所述 - 本地一切正常。定義我的自定義appender的程序集肯定是加載的,因爲它還包含我的web應用程序的業務邏輯,該應用程序也在Azure中部署。

UPDATE

有趣的發現。當我使用Debug構建配置時,任何地方都可以工作(天藍色的web角色)。但是當我使用Release配置(這是打包和生產代碼的默認配置)時,我似乎無法使log4net在任何地方工作。這意味着我無法使Log4Net以Release配置在本地運行。沒有例外被提出,沒有錯誤被記錄。奇怪,因爲它可能是...

回答

1

原來Release構建造成的問題。根據log4net's FAQ section,通過彙編級別屬性配置log4net可能在DEBUGRELEASE配置中表現不同。

在我的設置中,我使用的是基於聲明初始化的static readonly property(基本控制器)。這似乎是錯誤的記錄器配置。我將Logger實例移動到我的Web應用程序類型的instance property,並將我的控制器屬性更改爲僅返回Application的屬性。現在,所有構建配置中的一切工作都正常。

0

關於Azure,我遇到了同樣的問題。我在發佈配置時遇到了這種情況,即使本地調試和發佈工作都正常,也不會記錄任何內容。 我的問題不是log4net的配置,而是它的初始化。

我有這樣的說法:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

所以後來我用下面的行替換它,它幫助:

private readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(WorkerRole)); 
相關問題