【Azure】App ServiceにデプロイしたASP.NET Core WebAPIのログをLog Analyticsで確認する
表題の通り、App ServiceでHTTPリクエストやログを確認する方法をまとめます。
前提
App Serviceリソースは作成済みで、ASP.NET Core WebAPIがデプロイされていることを前提としています。
詳細についてはVSCodeを使って、App ServiceにASP.NET Core WebAPIをデプロイするをご覧ください。
アプリケーションを変更する
dotnet new webapiコマンドでWebAPIを作成すると、デフォルトのコントローラとエンドポイントが展開されます。今回使用するWebAPIのベースは、そのデフォルト状態のものです。
このWebAPIに、今回Azure Portalから確認するためのログを仕込みます。WarnやErrorログのテスト用にエンドポイントも1つ追加しています。
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のログは出力されません
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
この状態でデプロイします。
デプロイ方法についても、VSCodeを使って、App ServiceにASP.NET Core WebAPIをデプロイするをご参照ください。
App Serviceの診断設定を構成する
App Serviceでログを確認するためには、診断設定の構成が必要です。
ここでは、HTTPリクエストのログとアプリケーションのLoggerによって出力されるログを確認したいので、HTTP logs
とApp Service Console Logs
とApp Service Application Logs
にチェックを付けます。
ログの宛先には、Log Analytics ワークスペースへの送信
を選択します。
App Serviceの診断設定
Log Analytics ワークスペースが存在しない場合は、事前に作成しておく必要があります。
Log Analytics ワークスペース
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