Сведения о ведении журнала, которые не включены в метод запуска функций Azure C#?

#c# #dependency-injection #azure-functions #ilogger #timer-trigger

#c# #инъекция зависимости #azure-функции #илоггер #таймер-триггер

Вопрос:

У меня было консольное приложение на C#, которое получало данные из базы данных, запрашивало их, а затем ждало 1 час, чтобы запросить новые данные. program.cs использовался в качестве класса запуска для выполнения инъекций зависимостей. Результаты, отображаемые на консоли при запуске консольного приложения, являются следующими:

Результаты консольного приложения

Мне пришлось преобразовать это консольное приложение в функцию запуска таймера azure, чтобы оно запускалось каждые 1 час, выполняло ту же работу, что и описано выше, и регистрировало ту же информацию, что и показано на рисунке. Поэтому я скопировал код из файла program.cs и вставил его в метод запуска триггера таймера. Вот код:

 namespace ExportServiceFunctionApp {  public class ExportServiceFunctionApp  {  [FunctionName("ExportServiceFunctionApp")]  public static void Run([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, ILogger log)  {  log?.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");   try  {  IServiceCollection services = new ServiceCollection();    services.AddSingletonlt;IDataReceiver, DataReceiver.DataReceivergt;()  .AddSingletonlt;IDataProcessor, DataProcessor.DataProcessorgt;()  .AddSingletonlt;IDataClient, KustoDataClientgt;()  .AddSingletonlt;IAzureBlobClient, AzureBlobClientgt;()  .AddSingletonlt;IAzureKustoClient, AzureKustoClientgt;()  .AddSingletonlt;IQueriesSettings, QueriesSettingsgt;()  .AddSingletonlt;IExportServiceSettings, ExportServiceSettingsgt;()  .AddTransientlt;IRawData, RawDatagt;()  .AddLogging();   IServiceProvider serviceProvider = services.BuildServiceProvider();   log?.LogInformation("Start initialization.");  var dataProcessor = serviceProvider.GetRequiredServicelt;IDataProcessorgt;();   log?.LogInformation("Start data processing.");  dataProcessor.Start();  }  catch (Exception ex)  {  }  }  } }  

Вы также можете найти структуру приложения функций здесь:

Функция Структура Приложения

ExportServiceFunctionApp.cs успешно выполняется, но чего мне здесь не хватает, так это журналов, поступающих из других классов. Примером может служить DataReceiver.cs (Примечание: Существуют и другие классы). Что мне нужно, так это иметь те же результаты и журналы, которые показаны выше в консольном приложении.

Результаты работы приложения функции показаны здесь:

Результаты приложения функций

Как вы можете видеть здесь, журналы, которые отображаются только на консоли, используются в методе Run приложения ExportServiceFunctionApp.cs, но все остальные журналы, которые используются в других классах, не являются

В качестве примера: ILogger вводится в конструктор DataReceiver, но журналы не отображаются на консоли, когда приложение функций выполняется локально. Вот код DataReceiver.cs

 public class DataReceiver : IDataReceiver  {  private readonly IExportServiceSettings _exportServiceSettings;  private readonly ILogger _logger;  private CancellationToken _cancellationToken;  private TimeSpan _interval;  private DateTime _lastTo;   public DataReceiver(IExportServiceSettings exportServiceSettings, ILoggerFactory loggerFactory)  {  _logger = loggerFactory?.CreateLoggerlt;DataReceivergt;();  _exportServiceSettings = exportServiceSettings;  }  

Файл host.json имеет следующую структуру:

 {  "version": "2.0",  "logging": {  "fileLoggingMode": "always",  "applicationInsights": {  "samplingSettings": {  "isEnabled": true,  "excludedTypes": "Request"  }  },  "logLevel": {  "default": "Information"  }  } }  

Может кто-нибудь, пожалуйста, подскажите мне, как регистрировать сообщения, поступающие из других классов, таким же образом, как они отображаются в результатах работы консольного приложения. Я до сих пор не знаю, почему отображаются только журналы в методе RUN. Я ранее задавал аналогичный вопрос, но, думаю, он не был объяснен должным образом.

Комментарии:

1. Вы должны передать тот же ILogger экземпляр, полученный функцией триггера, вашей рабочей функции, тогда вы сможете просматривать журналы.

2. @AnandSowmithiran Спасибо вам за ваш ответ. Не могли бы вы, пожалуйста, сказать мне, как это сделать ? В моем случае, что я должен добавить в файл DataReceiver.cs и что я должен изменить в файле host.json ?

3. Обработчик данных должен быть изменен, чтобы либо иметь свойство регистратора, либо принимать аргумент типа ILogger для своего метода запуска. Затем вы можете передать тот же log аргумент своей функции триггера. Кроме уровня журнала, вам не нужно ничего менять в файле host.json.

4. @AnandSowmithiran Спасибо за ваш ответ. У обработчика данных уже есть свойство регистратора, аналогично тому, как оно показано выше в приемнике данных. Я все еще не знаю, чего еще не хватает. Не могли бы вы, пожалуйста, сказать мне, что именно я должен делать в методе Run. Что следует туда добавить, потому что чего-то определенно не хватает. Я пытался решить эту проблему в течение последних нескольких дней, но она все еще не работает.