﻿# ASP.NET 部署到 Azure App Service 如何使用 Log stream 查看應用程式紀錄

當 Web 應用程式上傳到 Azure App Service 之後，開發人員第一個要面對的問題，就是要怎樣**偵錯**(Debug)？在本機開發應用程式通常開發工具都會幫我們整理好各種資訊，但是上到雲端環境後，很多人就會顯得手忙腳亂，有時候說是「瞎子摸象」也不為過，非常痛苦。這篇文章我打算帶大家入門，教大家怎樣用免費又簡單的方式使用 [Log stream](https://learn.microsoft.com/en-us/azure/app-service/troubleshoot-diagnostic-logs?WT.mc_id=DT-MVP-4015686) ([記錄資料流](https://learn.microsoft.com/zh-tw/azure/app-service/troubleshoot-diagnostic-logs?WT.mc_id=DT-MVP-4015686)) 查看應用程式執行紀錄！

### 啟用應用程式記錄 (Windows)

應用程式記錄 (Application Logging) 有提供兩種類型，兩種都可以同時啟用，但是各有不同的特性：

![應用程式記錄 (Application Logging)](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/b1b57b28b4a095827a07-209949493-9408531c-560b-4f29-ab8d-ea0d60603c3b.png)

1.  檔案系統 (Filesystem)
    
    這是一種臨時的偵錯解決方案，比較不適合長期保存，且啟用之後 12 小時內就會自動關閉。
    
2.  Blob
    
    你只要指定一個 Storage Account 的 Blob Container 就可以長久保存紀錄，但你可以透過 `Retention Period (Days)` 設定**應用程式記錄**的最多保留天數。
    

如果你想透過 [Log stream](https://learn.microsoft.com/en-us/azure/app-service/troubleshoot-diagnostic-logs?WT.mc_id=DT-MVP-4015686) ([記錄資料流](https://learn.microsoft.com/zh-tw/azure/app-service/troubleshoot-diagnostic-logs?WT.mc_id=DT-MVP-4015686)) 查看應用程式執行紀錄，那就一定要啟用 `應用程式記錄 (檔案系統)` 這一項才有效果！🔥

### 決定一個紀錄層級 (Log Level)

在啟用應用程式記錄的時候，有個 `層級` (`Level`) 欄位，當中有幾個不同的選項，他跟我們在開發 .NET 應用程式的 LogLevel 有直接相關，所以一定要選擇正確！

![Application logging](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/6a4385d29b095ca962a3-209944611-b637c08a-b3a9-4a05-bf0f-69b7d9536f4a.png)

![Log Level](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/1de3646e504b91a01e92-209950679-10da78e3-bb64-4b37-b9f9-ffd83c319e04.png)

### 應用程式的調整方法 (.NET Framework)

如果你開發的是 ASP.NET MVC 5 或 ASP.NET WebForms 應用程式，基本上什麼都不用設定，只要透過 [System.Diagnostics.Trace](https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.trace?view=netframework-4.8.1&WT.mc_id=DT-MVP-4015686) 類別提供的靜態方法，就可以將資料輸出到 Azure App Service 的應用程式記錄中！

```csharp
// 只要設定為 Verbose, Information, Warning, Error 層級都會輸出以下記錄
System.Diagnostics.Trace.TraceError("If you're seeing this, something bad happened");

// 只要設定為 Verbose, Information, Warning 層級都會輸出以下記錄
System.Diagnostics.Trace.TraceWarning("If you're seeing this, something bad happened");

// 只要設定為 Verbose, Information 層級都會輸出以下記錄
System.Diagnostics.Trace.TraceInformation("If you're seeing this, something bad happened");
```

### 應用程式的調整方法 (.NET / .NET Core)

如果你開發的是 ASP.NET Core 應用程式，也只需要 2 個步驟就可以啟用：

1.  安裝 [Microsoft.Extensions.Logging.AzureAppServices](https://www.nuget.org/packages/Microsoft.Extensions.Logging.AzureAppServices) 套件
    
    ```bash
    dotnet add package Microsoft.Extensions.Logging.AzureAppServices
    ```
    
2.  設定 Logging 來源
    
    ```bash
    builder.Logging.AddAzureWebAppDiagnostics();
    ```
    

就這樣，設定完成！應用程式部署到 Azure App Service 之後，就可以從 `Log stream` 頁面查看應用程式的「即時」紀錄了，比透過 Application Insights 上面收集的記錄還要即時輸出，非常適合用來偵錯應用程式！👍

> 注意：無論你在 `appsettings.json` 什麼樣的 `Logging` 記錄等級設定，在 `Log stream` 顯示的應用程式記錄都會以 Azure Portal 上面設定的 `Level` 為準。我用以下 `appsettings.json` 設定為例，即便你關閉了所有紀錄輸出，但你在 App Service logging 設定的 Level 為 `Warning`，那麼在 Log stream 所看到的依然會是 `Warning` 以上的紀錄內容！

```json
{
  "Logging": {
    "LogLevel": {
      "Default": "None",
      "Microsoft.AspNetCore": "None"
    }
  },
  "AllowedHosts": "*"
}
```

輸出記錄的寫法，就使用 .NET 標準的方式撰寫即可，以下是 `ILogger<T>` 程式碼範例：

```csharp
public class PrivacyModel : PageModel
{
    private readonly ILogger<PrivacyModel> _logger;

    public PrivacyModel(ILogger<PrivacyModel> logger)
    {
        _logger = logger;
    }

    public void OnGet()
    {
        _logger.LogCritical("[CRITI]: About page visited at {DT}",
                                  DateTime.UtcNow.ToLongTimeString());
        _logger.LogError("[ERROR]: About page visited at {DT}",
                                  DateTime.UtcNow.ToLongTimeString());
        _logger.LogWarning("[WARNN]: About page visited at {DT}",
                                  DateTime.UtcNow.ToLongTimeString());
        _logger.LogDebug("[DEBUG]: About page visited at {DT}",
                                  DateTime.UtcNow.ToLongTimeString());
        _logger.LogInformation("[INFOR]: About page visited at {DT}",
                                  DateTime.UtcNow.ToLongTimeString());
        _logger.LogTrace("[TRACE]: About page visited at {DT}",
                                  DateTime.UtcNow.ToLongTimeString());
    }
}
```

### 線上查看 Log stream 的方法

其實你只要點進 Log stream 之後，就會自動連接站台：

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/898decfea969fd4f8fa7-209187125-092194b5-6847-43fd-b461-406cd9b00b9e.png)

### 相關連結

-   [Enable diagnostics logging for apps in Azure App Service](https://learn.microsoft.com/en-us/azure/app-service/troubleshoot-diagnostic-logs?WT.mc_id=DT-MVP-4015686)
-   [Trace Class (System.Diagnostics) | Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.trace?view=netframework-4.8.1&WT.mc_id=DT-MVP-4015686)
