Application Insights-loggning med .NET
I den här artikeln lär du dig att samla in loggar med Application Insights i .NET-appar med hjälp Microsoft.Extensions.Logging.ApplicationInsights
av providerpaketet. Om du använder den här providern kan du fråga och analysera dina loggar med hjälp av Application Insights-verktygen.
Kommentar
Följande dokumentation förlitar sig på det klassiska API:et Application Insights. Den långsiktiga planen för Application Insights är att samla in data med OpenTelemetry. Mer information finns i Aktivera Azure Monitor OpenTelemetry för .NET-, Node.js-, Python- och Java-program och vår OpenTelemetry-översikt. Migreringsvägledning är tillgänglig för .NET, Node.js och Python.
Kommentar
Om du vill implementera hela utbudet av Application Insights-telemetri tillsammans med loggning kan du läsa Konfigurera Application Insights för dina ASP.NET webbplatser eller Application Insights för ASP.NET Core-program.
Dricks
Microsoft.ApplicationInsights.WorkerService
NuGet-paketet, som används för att aktivera Application Insights för bakgrundstjänster, ligger utanför omfånget. Mer information finns i Application Insights för Worker Service-appar.
ASP.NET Core-program
Så här lägger du till Application Insights-loggning i ASP.NET Core-program:
Microsoft.Extensions.Logging.ApplicationInsights
Installera .Lägg till
ApplicationInsightsLoggerProvider
:
using Microsoft.Extensions.Logging.ApplicationInsights;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Logging.AddApplicationInsights(
configureTelemetryConfiguration: (config) =>
config.ConnectionString = builder.Configuration.GetConnectionString("APPLICATIONINSIGHTS_CONNECTION_STRING"),
configureApplicationInsightsLoggerOptions: (options) => { }
);
builder.Logging.AddFilter<ApplicationInsightsLoggerProvider>("your-category", LogLevel.Trace);
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
När NuGet-paketet är installerat och providern registreras med beroendeinmatning är appen redo att loggas. Med konstruktorinmatning krävs antingen ILogger eller det generiska alternativet ILogger<TCategoryName> . När de här implementeringarna har lösts tillhandahåller ApplicationInsightsLoggerProvider
du dem. Loggade meddelanden eller undantag skickas till Application Insights.
Tänk på följande exempelkontrollant:
public class ValuesController : ControllerBase
{
private readonly ILogger _logger;
public ValuesController(ILogger<ValuesController> logger)
{
_logger = logger;
}
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
_logger.LogWarning("An example of a Warning trace..");
_logger.LogError("An example of an Error level message");
return new string[] { "value1", "value2" };
}
}
Mer information finns i Logga in ASP.NET Core och Vilken Application Insights-telemetrityp skapas från ILogger-loggar? Var kan jag se ILogger-loggar i Application Insights?.
Konsolprogram
Om du vill lägga till Application Insights-loggning i konsolprogram installerar du först följande NuGet-paket:
I följande exempel används paketet Microsoft.Extensions.Logging.ApplicationInsights och visar standardbeteendet för ett konsolprogram. Microsoft.Extensions.Logging.ApplicationInsights-paketet bör användas i ett konsolprogram eller när du vill ha en minimal implementering av Application Insights utan den fullständiga funktionsuppsättningen, till exempel mått, distribuerad spårning, sampling och telemetriinitierare.
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using var channel = new InMemoryChannel();
try
{
IServiceCollection services = new ServiceCollection();
services.Configure<TelemetryConfiguration>(config => config.TelemetryChannel = channel);
services.AddLogging(builder =>
{
// Only Application Insights is registered as a logger provider
builder.AddApplicationInsights(
configureTelemetryConfiguration: (config) => config.ConnectionString = "<YourConnectionString>",
configureApplicationInsightsLoggerOptions: (options) => { }
);
});
IServiceProvider serviceProvider = services.BuildServiceProvider();
ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();
logger.LogInformation("Logger is working...");
}
finally
{
// Explicitly call Flush() followed by Delay, as required in console apps.
// This ensures that even if the application terminates, telemetry is sent to the back end.
channel.Flush();
await Task.Delay(TimeSpan.FromMilliseconds(1000));
}
Mer information finns i Vilken Application Insights-telemetrityp skapas från ILogger-loggar? Var kan jag se ILogger-loggar i Application Insights?.
Loggningsomfång
ApplicationInsightsLoggingProvider
stöder loggomfattningar. Omfång är aktiverade som standard.
Om omfånget är av typen IReadOnlyCollection<KeyValuePair<string,object>>
läggs varje nyckel/värde-par i samlingen till i Application Insights-telemetrin som anpassade egenskaper. I följande exempel registreras loggar som TraceTelemetry
och har ("MyKey", "MyValue")
i egenskaper.
using (_logger.BeginScope(new Dictionary<string, object> { ["MyKey"] = "MyValue" }))
{
_logger.LogError("An example of an Error level message");
}
Om någon annan typ används som omfång lagras den under egenskapen Scope
i Application Insights-telemetri. I följande exempel TraceTelemetry
har en egenskap som heter Scope
som innehåller omfånget.
using (_logger.BeginScope("hello scope"))
{
_logger.LogError("An example of an Error level message");
}
Vanliga frågor och svar
Vilken Application Insights-telemetrityp skapas från ILogger-loggar? Var kan jag se ILogger-loggar i Application Insights?
ApplicationInsightsLoggerProvider
ILogger
registrerar loggar och skapar TraceTelemetry
från dem. Om ett Exception
objekt skickas till -metoden på ILogger
Log
ExceptionTelemetry
skapas i stället för .TraceTelemetry
Visa ILogger-telemetri
I Azure-portalen:
- Gå till Azure Portal och få åtkomst till application insights-resursen.
- Välj avsnittet Loggar i Application Insights.
- Använd Kusto-frågespråk (KQL) för att köra frågor mot ILogger-meddelanden som lagras i
traces
tabellen. Exempelfråga:traces | where message contains "YourSearchTerm"
. - Förfina dina frågor för att filtrera ILogger-data efter allvarlighetsgrad, tidsintervall eller specifikt meddelandeinnehåll.
I Visual Studio (lokalt felsökningsprogram):
- Starta programmet i felsökningsläge i Visual Studio.
- Öppna fönstret Diagnostikverktyg medan programmet körs.
- På fliken Händelser visas ILogger-loggar tillsammans med andra telemetridata.
- Om du vill hitta specifika ILogger-meddelanden använder du sök- och filterfunktionerna i fönstret Diagnostikverktyg .
Om du föredrar att alltid skicka TraceTelemetry
använder du det här kodfragmentet:
builder.AddApplicationInsights(
options => options.TrackExceptionsAsExceptionTelemetry = false);
Varför har vissa ILogger-loggar inte samma egenskaper som andra?
Application Insights samlar in och skickar ILogger
loggar med samma TelemetryConfiguration
information som används för alla andra telemetrier. Men det finns ett undantag. Som standard TelemetryConfiguration
är inte helt konfigurerat när du loggar från Program.cs eller Startup.cs. Loggar från dessa platser har inte standardkonfigurationen, så de kör inte alla TelemetryInitializer
instanser och TelemetryProcessor
instanser.
Jag använder det fristående paketet Microsoft.Extensions.Logging.ApplicationInsights och vill logga mer anpassad telemetri manuellt. Hur ska jag göra det?
När du använder det fristående paketet TelemetryClient
matas du inte in i di-containern (dependency injection). Du måste skapa en ny instans av TelemetryClient
och använda samma konfiguration som loggningsprovidern använder, som följande kod visar. Det här kravet säkerställer att samma konfiguration används för all anpassad telemetri och telemetri från ILogger
.
public class MyController : ApiController
{
// This TelemetryClient instance can be used to track additional telemetry through the TrackXXX() API.
private readonly TelemetryClient _telemetryClient;
private readonly ILogger _logger;
public MyController(IOptions<TelemetryConfiguration> options, ILogger<MyController> logger)
{
_telemetryClient = new TelemetryClient(options.Value);
_logger = logger;
}
}
Kommentar
Om du använder Microsoft.ApplicationInsights.AspNetCore
paketet för att aktivera Application Insights ändrar du den här koden för att komma TelemetryClient
direkt i konstruktorn.
Jag har inte installerat SDK och använder Azure Web Apps-tillägget för att aktivera Application Insights för mina ASP.NET Core-program. Hur gör jag för att använda den nya providern?
Application Insights-tillägget i Azure Web Apps använder den nya providern. Du kan ändra filtreringsreglerna i appsettings.json-filen för ditt program.