🍓

【Azure】App ServiceにデプロイしたASP.NET Core WebAPIのログをLog Analyticsで確認する

2024/04/14に公開

表題の通り、App ServiceでHTTPリクエストやログを確認する方法をまとめます。

前提

App Serviceリソースは作成済みで、ASP.NET Core WebAPIがデプロイされていることを前提としています。

詳細についてはVSCodeを使って、App ServiceにASP.NET Core WebAPIをデプロイするをご覧ください。

https://zenn.dev/shimiyu/articles/8b17cee91cfa02

アプリケーションを変更する

dotnet new webapiコマンドでWebAPIを作成すると、デフォルトのコントローラとエンドポイントが展開されます。今回使用するWebAPIのベースは、そのデフォルト状態のものです。

このWebAPIに、今回Azure Portalから確認するためのログを仕込みます。WarnやErrorログのテスト用にエンドポイントも1つ追加しています。

WeatherForecastController.cs
using Microsoft.AspNetCore.Mvc;

namespace practiceWebApi.Controllers;

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{

    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

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

    [HttpGet(Name = "GetWeatherForecast")]
    public IEnumerable<WeatherForecast> Get()
    {
        // Trace / Debugレベルのログを追加
        _logger.LogTrace("Trace: Getting weather forecast");
        _logger.LogDebug("Debug: Starting to get weather forecasts");

        // Console.WriteLine
        Console.WriteLine("Starting to get weather forecasts from Console WriteLine");

        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();
    }

    // Warn / Error 系のログを出力するテストエンドポイントを追加
    [HttpGet("test-exception")]
    public IActionResult TestException()
    {
        try
        {
            _logger.LogInformation("Information: About to throw an exception for testing purposes.");
            throw new InvalidOperationException("テスト例外");
        }
        catch (Exception ex)
        {
            _logger.LogWarning("Warning: 例外が発生しました。");
            _logger.LogError(ex, "Error: 例外が発生しました。");
            _logger.LogCritical("Critical: 例外が発生しました。");
            return StatusCode(500, "時間を置いて試してください。");
        }
    }
}

ログレベルは、デフォルトのInformationのままとします。

ここで設定したレベル以上のログが出力されるようになります。この場合、Information以上のログが出力されるようになり、TraceやDebugのログは出力されません

appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

この状態でデプロイします。

デプロイ方法についても、VSCodeを使って、App ServiceにASP.NET Core WebAPIをデプロイするをご参照ください。

App Serviceの診断設定を構成する

App Serviceでログを確認するためには、診断設定の構成が必要です。

ここでは、HTTPリクエストのログとアプリケーションのLoggerによって出力されるログを確認したいので、HTTP logsApp Service Console LogsApp Service Application Logsにチェックを付けます。

ログの宛先には、Log Analytics ワークスペースへの送信を選択します。


App Serviceの診断設定

Log Analytics ワークスペースが存在しない場合は、事前に作成しておく必要があります。


Log Analytics ワークスペース

https://learn.microsoft.com/ja-jp/azure/app-service/monitor-app-service-reference#resource-logs

Log Analyticsでログを確認する

APIを実行する

デプロイしたAPIの2つのエンドポイントをブラウザに打ち込みます。

https://{App Serviceのドメイン}/weatherforecast/

https://{App Serviceのドメイン}/weatherforecast/test-exception

AppServiceHTTPLogsを確認する

診断設定で宛先に指定したLog Analytics ワークスペースを開きます。

クエリを入力するスペースが出てくるので、AppServiceHTTPLogsと入力します。

すると、前項で実施したAPI実行のHTTPリクエストログが残っているのを確認できます。

ログを開くと、より詳細の内容を確認できます。

AppServiceConsoleLogsを確認する

続いて、AppServiceConsoleLogsのログを確認します。

クエリを入力するスペースに、AppServiceConsoleLogsと入力します。

https://{App Serviceのドメイン}/weatherforecastのエンドポイント実行時のログが残っているのが確認できます。

appsettings.jsonでログレベルをInformationにしているため、TraceやDebugレベルのログは出力されていません。


weatherforecastエンドポイントのコンソールログ

続いて、https://{App Serviceのドメイン}/weatherforecast/test-exceptionのエンドポイント実行時のログも見てみましょう。

想定通り、ソースコード側で設定した4つのログ(Information,Warning,Error,Critical)が出力されています。


weatherforecast/test-exceptionエンドポイントのコンソールログ

(おまけ)ログストリーム

App Serviceにはログストリームという項目があります。

ログストリームでもログ自体は確認できますが、

  • リアルタイムのログ監視向き
  • 長期間ログを保存できない
  • クエリやアラートの設定ができない

などの特徴があります。

短期的なトラブルシュートには便利ですが、長期的なデータ保持、分析、アラート作成など、高度な機能は持ち合わせていません。

Log Analyticsをメインとして使用しつつ、用途に応じてログストリームを補助的に使うのが現実的かと思われます。

Discussion