只有累積,沒有奇蹟

2019年3月7日 星期四

[.NETCore] ASP.NET Core - Logging 日誌初體驗 (一)

前言
在前一篇的文章裡介紹 ASP.Net Core 中如使用 NLog 將日誌紀錄於指定的位置檔案中,在ASP.Net Core 內建 logging framework ,專門負責記錄 log 與提供 API 與第三方紀錄套件像是 NLog、Log4Net 整合搭配使用,這篇文章是閱讀 MSDN 官網的 ASP.NET Core logging 後摘錄重點筆記,若有問題歡迎提出一起討論或是給予指導

使用 ILogger
首先新增一個 .Net Core API 專案測試 Logging Framework,在 .NET Core 中到處充滿著 DI (Dependency Injection) 的設計,DI 要使用的第一步是要先註冊,因此在專案一起來時 Startup.cs 類別中的 configureServices 中注入日誌,且透過 AddConsole() 方法將所要輸出的日誌內容輸出至 Visual Studio 視窗中。在 configureServices 區段新增下列代碼
  1. services.AddLogging(builder =>
  2. {
  3. builder.AddConfiguration(Configuration.GetSection("Logging"))
  4. .AddConsole()
  5. .AddDebug();
  6. });
接著在開啟範例專案的 ValueController 類別,在 ValuesController 新增參數為 ILogger 的建構子方法,並在方法中指定區域變數 _logger 為建構子指定的 logger,並於 public get 方法使用 loginformation 方法紀錄進來的參數值與 logWarning 方法紀錄異常時的資訊
  1. private ILogger _logger;
  2. public ValuesController(ILogger<ValuesController> logger)
  3. {
  4. _logger = logger;
  5. }
  6.  
  7. // GET api/values/5
  8. [HttpGet("{id}")]
  9. public ActionResult<string> Get(int id)
  10. {
  11. _logger.LogInformation("輸入的參數 id : {id}", id);
  12. if (id == 0)
  13. {
  14. _logger.LogWarning("參數 id 為 0, 方法不支援也找不到資料唷");
  15. }
  16.  
  17. return "value";
  18. }
完成後建置專案並進行測試,啟動專案並在網址輸入  https://localhost/api/values/9487  和  https://localhost/api/values/0  測試該 API 接口 Log 狀況,輸出訊息資訊一開始是指定 AddConsole() 所以可以再 Visual Studio 的 output windows 輸出內容如下
可以看到 Log 的內容大部分為 .NET Core Lifecycle 進行時所記錄的日誌,紅色框的部分則是稍早測試希望記錄的日誌訊息,輸入的參數為 xx 都有被正確的記錄下來,從以上可以知道在 .NET Core 中內建的 logging Framework 使用上並不困難,且在此案例中並未使用到其他 logging 框架也可將資訊正確的輸出,

使用 ILoggerFactory
使用 ILogger 輸出時預設記錄日誌類別名稱,已 Demo專案為例 namespace 為 NETCoreLogging.Controllers,類別命名為 ValueController 因此日誌看到的完整訊息為下
  1. NETCoreLogging.Controllers.ValueController:your log balabalalalalaala
如果希望用不同的方式來命名的話,則可以使用 ILoggerFactory.CreateLogger 來達到自訂的需求,ILogger 與 ILoggerFactory 兩個介面都是  Microsoft.Extensions.Logging  命名空間底下取得,使用方式如下
  1. public ILogger _logger;
  2. public ValuesController(ILoggerFactory logger)
  3. {
  4. _logger = logger.CreateLogger("MyDemoProject");
  5. }
將建構子注入的 ILogger 改為 ILoggerFactory 介面,接著在使用 ILoggerFactory.CreateLogger 方法來自訂名稱 MyDemoProject ,日誌輸出顯示如下
  1. MyDemoProject:Information: 輸入的參數 id : 9527
兩種方式在使用上都不難,端看團隊需求而定是走預設  ILogger  或是想自訂日誌格式  ILoggerFactory 

篩選紀錄
上面介紹了如何使用 .NET Core 內建的 logging Framework 輸出日誌,在輸出的日誌中看到了很多 Microsoft 或是 system 類的 log 資訊,這些資訊在過去是比較少看到的,假設今天希望在特定專案可以不要輸出這些底層或是日誌資訊,則可以透過 logging 中的篩選機制  AddFilter 來達到此目的,舉例來說將在 configureServices 區段加上 addFilter 設定篩選的條件
  1. services.AddLogging(builder =>
  2. {
  3. builder.AddConfiguration(Configuration.GetSection("Logging"))
  4. .AddFilter("Microsoft", LogLevel.Warning)
  5. .AddConsole()
  6. .AddDebug(); 
  7. }
原本的日誌內容就會從
  1. Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:44301/api/values/7777
  2. Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Route matched with {action = "Get", controller = "Values"}. Executing action NETCoreLogging.Controllers.ValuesController.Get (NETCoreLogging)
  3. Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executing action method NETCoreLogging.Controllers.ValuesController.Get (NETCoreLogging) with arguments (7777) - Validation state: Valid
  4. MyDemoProject:Information: 輸入的參數 id : 7777
  5. Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action method NETCoreLogging.Controllers.ValuesController.Get (NETCoreLogging), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 4.4479ms.
  6. Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor:Information: Executing ObjectResult, writing value of type 'System.String'.
  7. Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action NETCoreLogging.Controllers.ValuesController.Get (NETCoreLogging) in 67.7888ms
  8. Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 82.4591ms 200 text/plain; charset=utf-8
改為
  1. MyDemoProject:Information: 輸入的參數 id : 7777
塞選過後精簡許多,過濾掉許多不需要的資訊留下真正重要的內容,如果想了解更多關於 logging 篩選的規則也可以參考 MSDN 官方說明 : 傳送門 

後記
這篇簡單說到在.NET Core 如何使用 ILogger 與 ILoggerFactory 紀錄 Log 的方式,以及如何篩選需要的 log 方法,原本想在介紹 appsettings.json 與 Log level 差異但想一想還是拆成兩篇來詳細說明比較適合,在之後的時間可以在整理出來讓大家更容易了解,也希望自己可以有時間不要像是獵人一樣拖稿 XDD

參考
ASP.NET Core 中的記錄



Related Posts:

  • [CheatSheets] LINQ API 廢話 LINQ的好用大家都知道,今天不小心發現LINQ API簡單易上手的圖片介紹檔(大喜 也簡單做個筆記方便日後查詢使用 :D 同場加映 : LINQ Tutorial … Read More
  • [Nuget] Nuget operation failed前言     為了取得/建置專案的方便,最近常遇到同事透過 powershell 指令使用svn取得最新的代碼並呼叫MSBuild自動建置專案,今天在執行完前同事所撰寫的 powershell script 後開啟專案跳出 Nuget operation failed 提示訊提,這種情況還是第一次遇到,新筆電與桌基平常都正常來記錄處理臭蟲的過程 症狀 開啟Visual Studio 2017跳出錯誤訊息:Nuget o… Read More
  • [IIS] HTTP 錯誤 500.21 - Internal Server Error前言 換新筆電後在安裝公司專案過程遇到很多問題,昨天是SQL Server服務異常關閉,今天是專案出現問題是"HTTP 錯誤500.21 - Internal Server Error",但這樣也不錯,可以學到更多新知識與問題,這裡簡單紀錄一下處理過程 錯誤訊息 HTTP 錯誤 500.21 HTTP Status Code 狀態碼 是Server端 Response 的狀態,在 Status Code Definitions&nbs… Read More
  • [VS2017] 如何設定 Visual Studio 2017 預設用 Administrator身份執行發生情境 身為一位專業的大內攻城師,相信很多人都使用過 Visual Studio Debug的經驗,可以透過 偵錯 > 附加至處理序 來找到錯誤,如果不熟悉的可以參考 mrkt 大的 Visual Studio 使用「附加至處理序」來進行偵錯 文章內有詳細的說明,今天重點不是介紹怎麼用,是在 attach IIS process 的過程中,都會跳出一個視窗詢問是否要使用 Admin 權限來進行偵錯,如下圖 之前遇到都很鴕鳥的… Read More
  • [typescript] 如何在 Visual Studio 2017 安裝 TypeScript 1.8 Compiler ? 前言 最近公司在進行升級 Visual Studio 2017 IDE,有些專案在過去開發時是使用舊的 TypeScript 版本,這篇文章是在記錄如何在 Visual Studio 2017安裝 TypeScript 1.8版 Compiler (預設不會裝) 的過程 釐清案情專案從版控下載後發現Build不過,發現錯誤訊息如下圖 錯誤訊息疑似是版本不支援關係,這時需要查看此專案檔用 TypeScript用到的版本號為 1… Read More

0 意見:

張貼留言

Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com