傳統.NET 4.x應用容器化體驗(6)
在Windows Container中,沒有寫日誌的情況下,如何排查系統的異常資訊?
1 關於Windows事件日誌
在以往基於IIS部署ASP.NET應用程式時,如果沒有寫指定日誌的情況下,我們往往會使用Window事件日誌來檢視一些錯誤資訊。
雖然事件日誌的可讀性和易用性不夠好,但是還是可以幫助我們檢視一些問題。這不,我在公司測試環境部署了我們團隊的老系統(大單體ASP.NET MVC專案)的Service專案做POC試點驗證,跑了幾個介面之後發現系統直接返回503錯誤。對於第一次在Windows Container上跑ASP.NET MVC應用的我來說,有點懵,在容器內部檢視IIS Log也沒有足夠的資訊,我能想到的,就是去看事件日誌了。
2 Docker下檢視事件日誌
Step1. 首先進入ASP.NET MVC容器例項內部:
>docker exec -it <container_name> powershell
Step2. 獲取最新的20個事件日誌,獲得對應日誌的Index:
>Get-Eventlog -newest 20 application Index Time EntryType Source InstanceID Message 96 Jul 22 15:34 Information Windows Error Rep... 1001Fault bucket , type 0... 95 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0... 94 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0... 93 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...92 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0... 91 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0... 90 Jul 22 15:34 Error Application Error 1000 Faulting application name: w3wp.exe, version: 1... 89 Jul 22 15:34 Error .NET Runtime 1026 Application: w3wp.exe... 88 Jul 22 15:34 Error ASP.NET 4.0.30319.0 3221226797 An unhandled exception occurred and the process... 87 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0... 86 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0... 85 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0... 84 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0... 83 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0... ......
Step3. 找到出錯的那幾個index,通過下面的命令檢視錯誤日誌:
>(Get-Eventlog -index 89 application).message An unhandled exception occurred and the process was terminated. Application ID: /LM/W3SVC/1/ROOT Process ID: 7664 Exception: System.TypeInitializationException Message: The type initializer for 'NewLife.Log.XTrace' threw an exception. StackTrace: at NewLife.Log.XTrace.WriteException(Exception ex) at NewLife.Threading.ThreadPoolX.<>c__DisplayClass2_0.<QueueUserWorkItem>b__0(Object s) at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() at System.Threading.ThreadPoolWorkQueue.Dispatch() InnerException: System.UnauthorizedAccessException Message: Access to the path 'C:\inetpub\wwwroot\Config' is denied. StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost ) at System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost) at System.IO.PathHelper.EnsureDirectory(String path, Boolean isfile) ......
從錯誤日誌中可以看到,Config目錄訪問不到,經過調查發現,原來已有系統的IIS目錄下有一個手動拷貝進去的Config目錄(正確做法應該將其作為解決方案的一部分內容始終輸出到release目錄),於是乎將其拷貝到容器目錄下,重新打映象和執行,問題解決,平穩執行!
3 總結
本文介紹瞭如何在Windows Container中通過事件日誌排查ASP.NET應用程式的異常日誌資訊,雖然文章很短小,但希望對你有用。
對於傳統.NET 4.x應用的容器化遷移,我們也還在探索,相信探索和實踐的深入,我會分享更多相關的內容。
作者:周旭龍
出處:https://edisonchou.cnblogs.com
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。