Application Insights в консольном приложении IHostedService

Я пытаюсь включить Application Insights в консольном приложении, используя IHostedService (на данный момент это простое консольное приложение, которое мы запускаем как WebJob, в будущем в контейнерах).

Насколько мне известно, в следующем коде пока нет расширения для глобальной регистрации Application Insights в качестве реализации ILogger:

  public static class Program
    {
        public static Task Main(string[] args)
        {
            var hostBuilder = new HostBuilder()
                .ConfigureHostConfiguration(config =>
                {
                    config.SetBasePath(Directory.GetCurrentDirectory());
                    config.AddJsonFile("appsettings.json", optional: false);
                    config.AddEnvironmentVariables();
                })
                .ConfigureLogging((context, logging) =>
                {
                    logging.AddConfiguration(context.Configuration.GetSection("Logging"));

                    if (context.HostingEnvironment.IsDevelopment())
                    {
                        logging.AddConsole();
                    }
                    else
                    {
                        //TODO: register ApplicationInsights
                    }
                });

            return hostBuilder.RunConsoleAsync();
        }
    }

На данный момент я обнаружил, что потенциально я должен иметь возможность настроить все, используя пользовательскую реализацию регистратора, то есть public class ApplicationInsightsLogger : ILogger, а затем... зарегистрировать его в контейнере, чтобы DI разрешил его.

Это правильное направление?


comment
почему бы не интегрировать ILogger с анализом приложений? вы можете легко сделать это, добавив пакет app-insight.   -  person Ivan Yang    schedule 12.09.2018
comment
Да, поэтому прямо сейчас мы подготовили перегрузку ILogger для использования AppInsights + LoggerProvider, зарегистрированных в контейнере. Но это не очень элегантно, учитывая, что некоторые из этих функций есть в Microsoft.ApplicationInsights.Web. Проблема в том, что то, что нам нужно, находится в этой библиотеке, но пока не абстрагировано в отдельный пакет для GenericHost.   -  person xagon    schedule 13.09.2018


Ответы (1)


Я сделал расширение, которое я мог использовать либо из IHost, либо из IWebHost:

using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.ApplicationInsights;

public static class LoggingBuilderExtensions
{
    public static ILoggingBuilder AddLogging(this ILoggingBuilder loggingBuilder)
    {
        loggingBuilder.AddFilter<ApplicationInsightsLoggerProvider>("", LogLevel.Trace);
        loggingBuilder.AddAzureWebAppDiagnostics();
        loggingBuilder.AddApplicationInsights();
        return loggingBuilder;
    }
}

Поскольку я не отправляю в контексте (HostBuilderContext или WebHostBuilderContext), я могу использовать его в любом типе приложения, например:

new HostBuilder().ConfigureLogging(loggingBuilder => loggingBuilder.AddLogging())

or

WebHost.CreateDefaultBuilder().ConfigureLogging(loggingBuilder => loggingBuilder.AddLogging())

Если вам нужно определенное свойство из контекста (например, тип среды), вы можете извлечь его и отправить в качестве параметра в расширение.

Вот ссылка: https://github.com/Microsoft/ApplicationInsights-dotnet-logging/blob/develop/src/ILogger/Readme.md

person crgolden    schedule 26.02.2019
comment
Это хорошо, я проверю это в ближайшее время. Поскольку я изначально отказался от сообщения, реализация немного изменилась. Теперь это может быть даже не проблема. Документы Microsoft также лучше. Спасибо. - person xagon; 27.02.2019