Asp.NetCore依赖注入和管道方式的异常处理及日志记录
前言
????在業務系統,異常處理是所有開發人員必須面對的問題,在一定程度上,異常處理的能力反映出開發者對業務的駕馭水平;本章將著重介紹如何在 WebApi 程序中對異常進行捕獲,然后利用 Nlog 組件進行記錄;同時,還將介紹兩種不同的
異常捕獲方式:管道捕獲/服務過濾;通過本練習,將學習到如何捕獲異常、處理異常跳轉、記錄異常信息。
搭建框架
????首先,創建一個 WebApi 項目,選擇 Asp.Net Core Web 應用程序;
進一步選擇 Api 模板,這里使用的 .netcore 版本為 2.1
取消勾選 “啟用 Docker 支持(E)” 和 “為 Https 配置(C)”,點擊確定,得到一個完整的 WebApi 項目框架,如圖
直接按 F5 運行項目,一切正常,程序啟動后進入默認路由調用,并輸出結果
異常路由
一切看起來都非常正常和美好,但,禍之福所倚;接下來我們在 接口 Get() 中人為的制造一點麻煩。
這是由于項目配置了運行環境變量 ASPNETCORE_ENVIRONMENT=Development 后,Startup.cs 中配置了開發環境下,使用系統默認頁,所以我們才可以看到上面的異常信息
如果你把環境變量設置為 ASPNETCORE_ENVIRONMENT=Production ,你會發現,在異常發生的時候,你得到了一個空白頁。
異常處理方式一:服務過濾
????在傳統的 Asp.Net MVC 應用程序中,我們一般都使用服務過濾的方式去捕獲和處理異常,這種方式非常常見,而且可用性來說,體驗也不錯,幸運的是 Asp.Net Core 也完整的支持該方式,接下來創建一個全局異常處理類 CustomerExceptionFilter
CustomerExceptionFilter 繼承自 IExceptionFilter 接口,并實現 void OnException(ExceptionContext context) 方法,在 CustomerExceptionFilter
構造方法中,定義了兩個參數,用于記錄異常日志和獲取程序運行環境變量
在接下來的 OnException 方法中,利用 environment 進行產品環境的判斷,并使用 logger 將日志寫入硬盤文件中,為了將日志寫入硬盤,
需要引用 Nuget 包 NLog.Extensions.Logging/NLog.Web.AspNetCore ,并在 Startup.cs 文件的 Configure 方法中添加擴展
上面的代碼讀取了配置文件 nlog.config 并設置為 NLog 的配置,該文件定義如下
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogLevel="info">
? <!-- Load the ASP.NET Core plugin -->
? <extensions>
? ? <add assembly="NLog.Web.AspNetCore"/>
? </extensions>
? <!-- Layout: https://github.com/NLog/NLog/wiki/Layout%20Renderers -->
? <targets>
? ? <target xsi:type="File" name="errorfile" fileName="/data/logs/logfilter/error-${shortdate}.log" layout="${longdate}|${logger}|${uppercase:${level}}|? ${message} ${exception}|${aspnet-Request-Url}" />
? ? <target xsi:type="Null" name="blackhole" />
? </targets>
? <rules>
? ? <logger name="Microsoft.*" minlevel="Error" writeTo="blackhole" final="true" />
? ? <logger name="*" minlevel="Error" writeTo="errorfile" />
? </rules>
</nlog>
為了在 WebApi 控制器中使用 CustomerExceptionFilter 過濾器,我們還需要在 Startup.cs 將 CustomerExceptionFilter 注入到容器中
最后,在控制器 ValuesController 中應用該異常過濾器
現在,按 F5 啟動程序,如預期所料,報錯信息被 CustomerExceptionFilter 捕獲,并轉換為 json 格式輸出
同時,NLog 組件也將日志信息記錄到了硬盤中
異常處理方式二:中間件捕獲
????接下來利用 .NetCore 的管道模式,在中間件中對異常進行捕獲,首先,創建一個中間件
代碼比較簡單,在管道中使用 try/catch 進行捕獲異常,創建 HandleException(HttpContext context, Exception e) 處理異常,判斷是 Development 環境下,輸出詳細的錯誤信息,非 Development 環境僅提示調用者“抱歉,出錯了”,同時使用 NLog 組件將日志寫入硬盤;
同樣,在 Startup.cs 中將 ExceptionMiddleware 加入管道中一切就緒,按 F5 運行程序,網頁中輸出了期望中的 json 格式錯誤信息,同時 NLog 組件也將日志寫入了硬盤
結語
????在本例中,通過依賴注入和管道中間件的方式,演示了兩種不同的全局捕獲異常處理的過程;值得注意到是,兩種方式對于 NLog 的使用,都是一樣的,沒有任何差別,代碼無需改動;實際項目中,也是應當區分不同的業務場景,輸出不同的
日志信息,不管是從安全或者是用戶體驗友好性上面來說,都是非常值得推薦的方式,全局異常捕獲處理,完全和業務剝離。
努力為開源社區作貢獻,推薦一個自己開發的基于 .netcore+pgsql 的快速開發腳手架,內置 ORM框架,github地址:https://github.com/lianggx/mystaging
文中如有疏漏之處,歡迎指正。
源碼下載:https://files.cnblogs.com/files/viter/Ron.LogFilter.zip
總結
以上是生活随笔為你收集整理的Asp.NetCore依赖注入和管道方式的异常处理及日志记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让 .Net 更方便的导入导出Excel
- 下一篇: .NET Core实战项目之CMS 第四