Мы хотим получить экземпляр ILogger, чтобы его можно было передать в другую библиотеку. Ниже мы попытались, но экземпляр ILogger не входит в Application Insights. Он успешно входит в средство просмотра событий.
var serviceCollection = new ServiceCollection();
serviceCollection.AddLogging(builder => builder
.AddFilter("Default", LogLevel.Information)
.AddFilter("Microsoft", LogLevel.Warning)
.AddFilter("System", LogLevel.Warning)
.AddEventLog(config => { config.LogName = "Pages"; config.SourceName = "Pages"; })
.AddApplicationInsights(telemetry =>
telemetry.ConnectionString = "my-key",
options => options = new ApplicationInsightsLoggerOptions()));
var serviceProvider = serviceCollection.BuildServiceProvider();
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("my-logger");
logger.LogInformation("Hi");
Мы добавили необходимые пакеты, например Microsoft.Extensions.Logging и Microsoft.Extensions.Logging.ApplicationInsights.
Неужели нельзя получить экземпляр ILogger из ServiceCollection для AppInsights?
Если вы используете Visual Studio, вы можете настроить Insights приложения напрямую с помощью параметра connection service
.
Просто нажмите на файл conneted service
в обозревателе решений.
После этого нажмите Add a service dependency
, чтобы настроить аналитику приложения.
Теперь появится всплывающее окно, в котором выберите Azure Application Insights
, затем нажмите «Далее».
Теперь выберите приложение Insghts из списка или создайте новое.
Выходные данные портала Azure: —
Я выяснил, что он не ведет журнал в AppInsights, потому что не было должным образом настроенных TelemetryChannel или TelemetryClient.
Подход 1 — использование канала телеметрии
using (var channel = new InMemoryChannel()) {
var serviceCollection = new ServiceCollection();
serviceCollection.Configure<TelemetryConfiguration>(config => config.TelemetryChannel = channel);
serviceCollection.AddLogging(builder => builder
.AddFilter("Default", LogLevel.Information)
.AddFilter("Microsoft", LogLevel.Warning)
.AddFilter("System", LogLevel.Warning)
.AddEventLog(config => { config.LogName = "Pages"; config.SourceName = "Pages"; })
.AddApplicationInsights(config => config.ConnectionString = "my-key",
options => { }));
var serviceProvider = serviceCollection.BuildServiceProvider();
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("my-logger");
logger.LogInformation("my new try"); channel.Flush();
System.Threading.Thread.Sleep(1000);
}
Подход 2 — внедрение клиента телеметрии с помощью пакета Microsoft.ApplicationInsights.WorkerService
var serviceCollection = new ServiceCollection();
serviceCollection.AddApplicationInsightsTelemetryWorkerService(options => options.ConnectionString = "my-key");
serviceCollection.AddLogging(builder => builder
.AddFilter<Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider>("", LogLevel.Information)
.AddFilter("Default", LogLevel.Information)
.AddFilter("Microsoft", LogLevel.Warning)
.AddFilter("System", LogLevel.Warning)
.AddEventLog(config => { config.LogName = "Pages"; config.SourceName = "Pages"; }));
var serviceProvider = serviceCollection.BuildServiceProvider();
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
var telemetryClient = serviceProvider.GetService<TelemetryClient>();
var logger = loggerFactory.CreateLogger("my-logger");
logger.LogInformation("my new try");
telemetryClient.Flush();
System.Threading.Thread.Sleep(1000);
Оба подхода будут работать нормально; мы использовали подход 2.
Как в этом случае настроить пользовательские журналы? Поскольку я хочу регистрировать пользовательские сообщения в средстве просмотра событий и в Application Insights, я использую ILogger.