在 Azure Function 中禁用实体框架日志记录

And*_*lin 10 logging entity-framework azure-functions

我在 .net5 (又名)中有一个 Azure 函数dotnet-isolated,并且我添加了这样的实体框架

services.AddDbContext<EfDbContext>(options =>
{
    options.UseSqlServer(context.Configuration[...], builder =>
    {
        builder.EnableRetryOnFailure();
    });
});
Run Code Online (Sandbox Code Playgroud)

当我运行该函数时,我在控制台中看到来自 EF 的数据库查询(根据颜色判断信息级别)。

在此输入图像描述

我怎样才能禁用它们?我在我的中尝试了明显的选项host.json

"logging": {
    "logLevel": {
        "Microsoft.EntityFrameworkCore": "Warning",
    }
}
Run Code Online (Sandbox Code Playgroud)

"logging": {
    "logLevel": {
        "default": "Information",
        "Microsoft.EntityFrameworkCore": "Warning",
        "Microsoft.EntityFrameworkCore.Database": "Warning",
        "Microsoft.EntityFrameworkCore.Query": "Warning"
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至

"logging": {
    "logLevel": {
        "Microsoft": "Warning",
    }
}
Run Code Online (Sandbox Code Playgroud)

但这没有帮助。唯一有效的选择是

"logging": {
    "logLevel": {
        "default": "Warning",
    }
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

And*_*lin 15

找到办法了。虽然这有点奇怪,但我仍然想了解它是如何工作的以及为什么这样做。无论如何,从AppInsights日志中我发现EF日志写在Function.<YOUR_FUNCTION_NAME>.User category下。(结果是标准 EF 类别在某种程度上被函数运行时覆盖了?)。

这意味着我可以通过以下方式影响特定函数的整体日志级别

    "logging": {
        "logLevel": {
            "Function.MyFunc1.User": "Debug",
            "Function.MyFunc2.User": "Warning"
        }
    }

Run Code Online (Sandbox Code Playgroud)

在里面host.json。它可能会有所帮助,但不能解决我的问题。

但是,如果我现在添加一个过滤器,如下所示Program.cs

var host = new HostBuilder()
  .ConfigureFunctionsWorkerDefaults()
  ...               
  .ConfigureLogging(builder =>
  {
    builder.AddFilter("Microsoft.EntityFrameworkCore", LogLevel.Warning);
  })
  ...
Run Code Online (Sandbox Code Playgroud)

EF 信息日志消失了。

  • 只是为了可能节省某人的时间,您需要使用 Microsoft.Extensions.Logging 进行引用,我在 VS2022 中的智能感知并没有给我这个建议,仅显示 AddFilter 不存在 (2认同)