Поделиться через


Логирование с помощью Application Insights в .NET

Из этой статьи вы узнаете, как собирать логи в приложениях .NET, используя Application Insights и пакет поставщика Microsoft.Extensions.Logging.ApplicationInsights. Используя этого поставщика, вы сможете выполнять запросы к журналам и их анализ с помощью средств Application Insights.

Внимание

Мы рекомендуем использовать дистрибутив Azure Monitor OpenTelemetry для новых приложений или клиентов, чтобы активировать Azure Monitor Application Insights. Дистрибутив OpenTelemetry в Azure Monitor обеспечивает аналогичные функциональные возможности и опыт, схожий с SDK Application Insights. Вы можете перейти из пакета SDK Application Insights с помощью руководств по миграции для .NET, Node.js и Python, но мы по-прежнему работаем над добавлением нескольких дополнительных функций для обратной совместимости.

Совет

Приложения ASP.NET Core

Чтобы добавить логирование через Application Insights в приложения ASP.NET Core:

  1. Установите Microsoft.Extensions.Logging.ApplicationInsights.

  2. Добавить 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();

После установки пакета NuGet и регистрации поставщика с помощью внедрения зависимостей приложение готово к ведению логов. При использовании внедрения через конструктор требуется либо ILogger, либо альтернатива универсального типа ILogger<TCategoryName>. Когда эти реализации будут решены, ApplicationInsightsLoggerProvider предоставит их. Зарегистрированные сообщения или исключения отправляются в Application Insights.

Рассмотрим следующий пример контроллера.

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" };
    }
}

Дополнительные сведения см. в разделе "Ведение журнала" в ASP.NET Core и тип телеметрии Application Insights, создаваемый из журналов ILogger? Где можно увидеть журналы ILogger в Application Insights?.

Консольное приложение

Чтобы добавить ведение журнала Application Insights в консольные приложения, сначала установите следующие пакеты NuGet:

В следующем примере используется пакет Microsoft.Extensions.Logging.ApplicationInsights и демонстрируется поведение по умолчанию для консольного приложения. Пакет Microsoft.Extensions.Logging.ApplicationInsights следует использовать в консольном приложении или всякий раз, когда требуется минимальная реализация Application Insights без полного набора функций, таких как метрики, распределенные трассировки, выборки и инициализаторы телеметрии.

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));
}

Для получения дополнительной информации см. Какой тип телеметрии Application Insights создается из журналов ILogger? Где можно посмотреть журналы ILogger в Application Insights?.

Области ведения журнала

ApplicationInsightsLoggingProvider поддерживает области журналов. Область включены по умолчанию.

Если тип области — IReadOnlyCollection<KeyValuePair<string,object>>, каждая пара "ключ — значение" в коллекции добавляется в данные телеметрии Application Insights в качестве пользовательских свойств. В следующем примере журналы записываются как TraceTelemetry и имеются ("MyKey", "MyValue") в свойствах.

using (_logger.BeginScope(new Dictionary<string, object> { ["MyKey"] = "MyValue" }))
{
    _logger.LogError("An example of an Error level message");
}

Если в качестве области используется любой другой тип, он сохраняется в свойстве Scope телеметрии Application Insights. В следующем примере TraceTelemetry имеет свойство Scope, которое содержит область.

using (_logger.BeginScope("hello scope"))
{
    _logger.LogError("An example of an Error level message");
}

Следующие шаги