Как настроить уровни журнала MS.Extensions.Logging в функции Azure?

У меня есть функция Azure, которая демонстрирует неожиданное поведение при ведении журнала. Вhost.json файл такой:

{
  "version": "2.0",
  "logging": {
    "fileLoggingMode": "never",
    "logLevel": {
      "default": "Information",
      "Function": "Information",
      "Host": "Warning",
    },
    "applicationInsights": {
      "samplingSettings": {
        "excludedTypes": "Exception"
      }
    }
  }
}

Я ожидаю, что с такой конфигурацией в App Insights не будут отображаться сообщения журнала отладки. Но мы видим, чтоlogger.IsEnabled(LogLevel.Debug) возвращает истину (где регистратор - ILogger). В пакете, который мы используем, есть дорогостоящая конструкция сообщения журнала, заключенная вIsEnabled вызывает, но этот код вызывается даже с конфигурацией выше.

Это происходит только в Azure; при локальном запуске мы не видим такого же поведения.

Как мы можем настроить ведение журнала в Azure, чтобы IsEnabled(LogLevel.Debug) возвращает false?

1 ответ

Я использую тот же host.json, что и ваш.

Сначала я сталкиваюсь с той же ситуацией, что и ваша.

Затем я упростил файл host.json.

Это мой код функции:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace LogLevelFunction
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
            string a = null;
            if(log.IsEnabled(LogLevel.Debug)) {
                log.LogInformation("Value is true.");
                a = "Value is true.";
            } else if(log.IsEnabled(LogLevel.Debug)==false){
                log.LogInformation("Value is false.");
                a = "Value is false.";
            }
            return (ActionResult)new OkObjectResult(a);
        }
    }
}

а это мой файл host.json:

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "Function.Function1": "information",
      "Function": "Error"
    }
  }
}

На локальном уровне, как вы его установите, будут соответствующие результаты. Например, если вы установите уровень журнала на ошибку, то информация об уровне информации не будет возвращена при срабатывании триггера. Как показано на следующем рисунке, префикс информации не отображается локально, но префикс информации отображается при работе на портале. Исполнение и Исполнение - это информационный уровень.

Локально, установка других уровней логирования может получить только возвращаемое значение "Значение ложно" и возвращает только "Значение истинно", если для уровня логирования установлено значение "отладка".

Затем я пытаюсь опубликовать эту функцию в Azure с логическим уровнем, равным информации. Затем я обнаружил, что функция return "Value" is true ". Это странно, поэтому я пытаюсь изменить уровень журнала на ошибку, затем я обнаружил, что в потоке журнала, который изначально использовался для отображения информации уровня информации, не отображается никакой информации. Это показывает, что установка уровня ошибки действительна. Но триггер по-прежнему возвращает "Value is True". Таким образом, вы можете думать только о том, что Azure заставляет каждую функцию сохранять уровень отладки независимо от установленного уровня доступа.

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

Другие вопросы по тегам