Azure Diagnostics 1.0 是以前標準的 Log 機制並且內建於 Azure SDK 之中,自從 Azure SDK 2.4 / Diagnostics 1.3 之後就可以針對 Cloud Service / IaaS VM 外掛 EventSource。而且這兩種的佈署方式差異非常大,剛好系統同時有 Trace 和 EventSource ( by SLAB ) 的 Log 方式,因此打算一併統一成相同的機制並且使用未來主流支援的方式。
如同剛剛所提到的 1.0 直接內建於 Azure SDK ,因此有跟 Visual Studio 開發工具整合,直接在 Azure 專案中按右鍵就可以選擇啟用診斷。而 1.2 以後的版本則是要用 PowerShell 的方式套用規則和啟動,另外這兩個版本無法同時啟動。
希望花了很多天踢完的鐵板可以讓各位節省一些時間 :)
若您的系統是從無到有建立 Diagnostics 1.3 + 的版本的話,建議直接參考這篇文章 Azure 雲端服務和虛擬機器中啟用診斷 ,以下的做法大致上都接近。
○、程式碼的部分
基本上要注意 不可以用 Attribute ,另外,Method 的參數不可以用 Object[] 因為 Diagnostics 機制無法動態對應和轉換型別。
一、 取得 DiagnosticsExtension Config
透過 Get-AzureServiceAvailableExtension 取得WadConfig.xsd 的檔案,建議跟稍後建立的 XML 檔一併放在專案檔之中,以便日後要做自動化建置和佈署時可以用得到。
(Get-AzureServiceAvailableExtension -ExtensionName 'PaaSDiagnostics' -ProviderNamespace 'Microsoft.Azure.Diagnostics').PublicConfigurationSchema | Out-File -Encoding utf8 -FilePath 'WadConfig.xsd'
這個預設會放到 C:\WadConfig.xsd ,所以別忘記用 Admin 的權限執行 PowerShell
Get-AzureServiceAvailableExtension : Your Azure credentials have not been set up or have expired, please run Add-AzureAccount to set up your Azure credentials.
若執行指令發生認證錯誤的話,請先執行 Add-AzureAccount 輸入認證
二、建立 XML 檔
回到 WorkRole 的專案上,並在新增一個 XML 檔案
記得要在 XML 的編輯器中直接按下 F4 會出現「屬性視窗」,點選結構描述後便可以看到這個畫面,再加入剛剛下載的 WadConfig.XSD 檔案
這個檔案會做註冊的動作,請移到跟專案目錄 或是版本管控之中,以便其他人可以直接使用取得或是可以給自動化佈署使用。
從網站上將這一整段的 XML 直接 copy 過來,這裡註解掉的意思是我不要分不同的 Blob Table ,全部都放在 WorkRoleLogTable 之中。請依系統的需求來決定
三、指定 Diagnostics Extension
執行這個語法之前,有幾個部分要特別注意
- CloudService 或是 VM 的服務務必要是「作用中」
- CloudService 相關的名稱都不可以有 Dot 「.」
圖片中的錯誤是 Role 的名稱有一個「.」
Slot 要注意是 「Staging」 的還是 「Production」 的,另外, Service Name 就是 CloudService 的服務名稱,而 Role 就是要填入 WorkRole 的 NameSapce ,若沒有問題則就會看到設定已經進去了。
- 這個設定只要佈署一次之後就會生效,除非服務整個刪除或是放在不同的 Slot 上
- Azure 專案上的「啟用診斷」必須不能勾選
- EventSource 上不可以用 Attribute ,Method 的參數也不可以用 Param Object[]
四、驗證 Diagnostics 是否正確運作
執行這個指令後就可以看到是否有在運作這裡要千萬注意,在 Cloud Service 和 Role 的命名規則中是不可以有「.」的存在,雖然用 PowerShell 不會出錯但它會自動幫你去掉,因此導致 Diagnostic 會無法正常對應。
五、Azure WebSites 的 SLAB
若您的系統有 WorkRole / WebSite 同時存在可能會考慮用到 SLAB 記錄 LOG ,那麼 EventSource 就勢必要用 Attribute 進行設定。因此這個設定的方式不可以跟 Diagnostics 1.2+ 的 EventSource 合併使用,去掉這個屬性的話會變成 SLAB 無法正常運作。所以必須要拆開不同的 Class
結果
若是設定都沒有出錯的話,在 Blob Table 上就會自動產生 WadWorkRoleLogTable 並且每 5 分鐘會批次寫入一次 Log 資料
參考資料
- Azure Diagnostics 1.3, 1.4, 1.5 Configuration Schema
有關於 LocalResourceDirectory 的位置則是在這裡 可以找到
- 在 Azure 雲端服務和虛擬機器中啟用診斷
- More Support for EventSource and strongly typed logging: The Semantic Logging Application Block