Ведение журнала анализа приложений — регистрируйте только то, что я говорю, и ничего больше

#azure #.net-core #azure-functions #azure-application-insights

#azure #.net-core #azure-функции #azure-application-insights

Вопрос:

У меня есть функция Azure V3 (.net core). Я использую ILogger от Microsoft.Расширения.Ведение журнала. Моя проблема в том, что я не могу заставить это делать:

  • Функция просто регистрирует то, что я добавляю в свой код на C #, используя ILogger. Либо информация, исключение, предупреждение, …

    пример: журнал.LogInformation («мой журнал»);

  • Ничего из встроенных функций ведения журнала, включая ошибки, исключения, зависимости, ничего

Мне нужно точное значение журнала host.json, которое это делает.

ТОЛЬКО ТО, ЧТО я ВКЛАДЫВАЮ В КОД C #, И НИЧЕГО БОЛЬШЕ.

Пример моего кода:

 [FunctionName("GetNetworkHouseDetail")]
public static IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = "network/houseMonitoringDevices")] HttpRequest req, ILogger log, ClaimsPrincipal claims)
{
  try
  {
    var start = DateTime.UtcNow;

    // some actions

    var end = DateTime.UtcNow;
    var duration = (end - start).TotalSeconds;
    log.LogInformation($"API - GetNetworkHouseDetail: took {duration} second to finish");
    return new OkObjectResult(JsonConvert.SerializeObject(result));
  }
  catch (Exception ex)
  {
      log.LogError($"{ex.GetExceptionMessages()}", ex);
  }
}
  

Ответ №1:

Ну, для этого вы можете использовать уровень журнала. Из документов:

Вы можете использовать Application Insights без какой-либо пользовательской настройки. Конфигурация по умолчанию может привести к большим объемам данных. Если вы используете подписку Visual Studio Azure, вы можете превысить ограничение данных для анализа приложений. Далее в этой статье вы узнаете, как настраивать и настраивать данные, которые ваши функции отправляют в Application Insights. Для функционального приложения ведение журнала настраивается в файле host.json.

Используя LogLevel None, вы можете отключить все ведение журнала для заданных категорий и поставщиков.

Например, вы можете сделать

 {
  "version": "2.0",
  "logging": {
    "LogLevel": {
      "Default": "None",
      "Host.Results": "Information",
      "Host.Aggregator": "Information",
      "Function.MyFunction.User": "Information"
    },
  }
}
  

Это отключит все ведение журнала, кроме вашей функции. Категория журнала для функции, написанной вами, — «Функция.<ИМЯ_ФУНКЦИИ YOUR_FUNCTION_NAME>.User.». (Замените <ИМЯ_ФУНКЦИИYOUR_FUNCTION_NAME> на фактическое имя вашей функции из атрибута functionName в вашем коде)

К сожалению, вам нужно указать все функции, вы не можете включить символы, такие как указание "Function.*.User": "Information" . Вы можете "Function": "Information" установить уровень журнала для всех функций на Информацию, но тогда также появится дополнительное ведение журнала.

Это также исключит отслеживание зависимостей и запросов из ведения журнала. Посмотрите это.

Если вы в какой-то момент захотите включить запросы и зависимости, вам необходимо установить уровень журнала для всех категорий, начиная с «Функции» Information .

Вы можете отключить ведение журнала из категорий хостов, но это особые категории, и теперь вы можете захотеть это сделать.

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

1. эта конфигурация не регистрирует ни один из моих журналов. он выполняет только запросы из встроенных журналов.

2. @Daniel Как называется ваша функция и как вы вводите ILogger, можете ли вы опубликовать какой-нибудь код? Потому что я протестировал его с помощью своей собственной функции, и он выводит журналы пользователей. Вы заменили «myFunction» именем вашей функции в моем примере конфигурации?

3. У меня много функций, разве я не могу сделать что-то вроде star для всех функций? просто обновил вопрос с помощью примера кода

4. @Daniel и можете ли вы также опубликовать свой host.conf? Полную рабочую демонстрацию можно найти здесь

5. @Daniel: У меня много функций, разве я не могу сделать что-то вроде star для всех функций? просто обновил вопрос примером кода AFAIK нет, обновил мой ответ

Ответ №2:

Указание LogLevel "Function.MyFunction.User": "Information" у меня вообще не работало, даже при явном написании всего пространства имен и имени функции. Но даже если бы это сработало, было бы очень сложно написать одну такую строку для каждой из ваших функций, не говоря уже о хрупкости при добавлении / удалении / переименовании функций и пространств имен. В итоге я получил уровень информации по умолчанию, а затем попытался «исключить» как можно больше категорий, не созданных пользователем. Кажется, пока все работает нормально.

 "logLevel": {
  "default": "Information",
  "Azure": "Warning",
  "Function": "Warning",
  "Host": "Warning",
  "Microsoft": "Warning",
  "System": "Warning"
},