前言
Application Insights 是微軟推出已久的監控服務,提供強大的分析工具協助診斷系統問題,
只許要在應用程式安裝SDK,簡單設定後即可使用。
先前大多碰到的情境都是將log寫到實體檔案,再透過filebeat 將log 送進elasticsearch,
最後透過Kibana視覺化資料,這種做法有以下兩個缺點。
- 額外Resource成本
- 需要額外設計log style,以利我們Trace Issue
Application Insights 幫我們解決掉上述的問題,
第一他成本非常低廉,你不需要再額外架設一台機器來做Log蒐集與監控,
第二Application Insights 完美的與微軟生態系整合(Asp.Net, Asp.Net Core),
所以我們不需要做任何的設定Application Insights 可以無痛(額外Coding)監控許多資訊,
Ex:
- Performance Counter
- 跨元件診斷(DB,3rd Service…)
- 應用程式與其他外部系統的對應(頻率,處理時間…)
也是因為擁有以上那麼多的優點,我們決定將這項產品導入到我們的系統中,
也就回到了該如何把我們的Log記錄到Application Insights呢?
Configuration
首先你需要在Azure上面新增一個Application Insights的Resource(這邊就不講解這段操作),
再來就是針對你得專案進行設定,
如果你是使用Visual Studio 只需要在專案上新增「Application Insights Telemetry」,
接下來按著指示設定你就完成第一部份得設定,
如果你是使用Vs Code, Rider…這類的IDE你就需要手動進行一些設定,
- 安裝「Microsoft.ApplicationInsights.AspNetCore」
- 在Startup ConfigureServices裡,加入一段程式碼
1 2 3 4 5
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddApplicationInsightsTelemetry(); }
- 你的appsettings.json上設定你的Instrumentation Key (這個Key可以在Application Insights的概觀上找到)
1 2 3 4 5
{ "ApplicationInsights": { "InstrumentationKey": "your Instrumentation Key" } }
當然你也可以不要在appsetting.json設定這個Key也可以直接在ConfigureServices時設定
1 2 3 4 5
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddApplicationInsightsTelemetry("your Instrumentation Key"); }
開始測試
簡單寫一下各層級的Log看一下Application Insights收不收得到。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Route("api/[controller]")]
[ApiController]
public class LogController : ControllerBase
{
private readonly ILogger<LogController> _logger;
public LogController(ILogger<LogController> logger)
{
_logger = logger;
}
[HttpGet]
[Route("LogTest")]
public IActionResult LogTest()
{
_logger.LogDebug("Debug!");
_logger.LogInformation("Information!");
_logger.LogWarning("Warning!");
_logger.LogError("Error!");
_logger.LogCritical("Critical!");
return Ok();
}
}
但Application Insights 上只看得到Warning以上的Log,
dotnet core 預設只記錄warning等級以上的訊息,若需要紀錄其他層級,則需要在ConfigureLogging做一些調整,
1
2
3
4
5
6
7
8
9
10
11
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
.ConfigureLogging(logger =>
{
logger.AddFilter<ApplicationInsightsLoggerProvider>("your name space",
LogLevel.Information);
});
}
調整完就可以順利在Application Insights上看到完整的Log。
注意事項
如果你得專案一開始有使用Serilog,Nlog…等LogProvider,會出現怎麼樣也無法出現在Application Insights上的問題, 簡單的處理方式是移除這些套件的依賴,但如果真的需要這些套件的一些功能,如:template,expression等, 就要另外針對該套件進行額外的設定,以Serilog來說必須安裝Serilog.Sinks.ApplicationInsights 有機會我們再來試試看。
參考
https://gavilan.blog/2020/01/29/asp-net-core-3-1-using-application-insights-to-save-logs/