如何在Azure函数中配置MS.Extensions.Logging日志级别?

如何在Azure函数中配置MS.Extensions.Logging日志级别?,azure,.net-core,azure-functions,microsoft-extensions-logging,Azure,.net Core,Azure Functions,Microsoft Extensions Logging,我有一个Azure函数,它显示了一些意外的日志记录行为。host.json文件如下: { "version": "2.0", "logging": { "fileLoggingMode": "never", "logLevel": { "default": "Information", "Function": "Information", "Host": "Warning", }, "applicationInsight

我有一个Azure函数,它显示了一些意外的日志记录行为。
host.json
文件如下:

{
  "version": "2.0",
  "logging": {
    "fileLoggingMode": "never",
    "logLevel": {
      "default": "Information",
      "Function": "Information",
      "Host": "Warning",
    },
    "applicationInsights": {
      "samplingSettings": {
        "excludedTypes": "Exception"
      }
    }
  }
}
通过这种配置,我希望AppInsights中不会显示调试日志消息。但我们看到的是,对
logger.IsEnabled(LogLevel.Debug)
的调用返回true(其中logger是
ILogger
)。我们正在使用的包有一些昂贵的日志消息构造,这些构造被包装在
IsEnabled
调用中,但即使使用上面的配置,也会调用这些代码

这只发生在Azure中;在本地运行时,我们看不到相同的行为


我们如何配置Azure中的登录,以便
IsEnabled(LogLevel.Debug)
返回false?

我使用与您相同的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);
        }
    }
}
在本地,如何设置它将有相应的结果。例如,如果将loglevel设置为error,则触发触发器时不会返回信息级别的信息。如下图所示,信息前缀为​​本地不显示,但信息前缀为​​在门户上运行时显示。执行和执行是信息级的

在本地,设置其他日志级别只能获得“value is false”的返回值,当日志级别设置为“debug”时,只能返回“value is true”

然后我尝试将此函数发布到Azure,日志级别等于信息。然后我发现函数返回'Value'为true'。这很奇怪,所以我尝试将loglevel更改为error,然后发现原来用于显示信息级别信息的logstream中没有显示任何信息。这表明错误级别的设置是有效的。但是触发器仍然返回“Value is True”。因此,您只能认为Azure强制每个函数保留调试级别,而不管访问级别设置如何

这可能是一个bug,因为似乎没有其他方法来设置访问级别,无论您如何设置,调试访问级别始终保持不变

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