Azure 函数无法绑定 ILogger

Posted

技术标签:

【中文标题】Azure 函数无法绑定 ILogger【英文标题】:Azure Function fails to bind ILogger 【发布时间】:2018-07-05 07:52:46 【问题描述】:

我的函数引用了一个引用 Microsoft.Extensions.Logging.Abstractions 2.0.0 的程序集。如果我将对该版本的 nuget 引用添加到函数的程序集中,函数执行将失败并显示:

[2018 年 1 月 25 日晚上 11:14:46] Microsoft.Azure.WebJobs.Host:索引错误 方法“TrainingFunction.Run”。 Microsoft.Azure.WebJobs.Host:不能 将参数“log”绑定到 ILogger。确保参数类型是 绑定支持。如果您使用绑定扩展(例如 ServiceBus、Timers 等)确保你已经调用了注册 启动代码中扩展的方法(例如 config.UseServiceBus()、config.UseTimers() 等)。

是否可以在 Azure 函数中使用较新的记录器? (SDK 1.0.7)

【问题讨论】:

【参考方案1】:

对我有用的是将“Microsoft.Extensions.Http”从版本 5.xxx 降级为“3.1.20”,这隐含地将“Microsoft.Extensions.Logging”降级为“3.1.20” "

看起来 Http 库的 5.x 版本和“Microsoft.Extensions.Logging” 5.x 版本存在隐式依赖关系,并且该版本的日志记录存在一些问题。

【讨论】:

【参考方案2】:

在自动更新我的 Nuget 包后,我突然开始收到 ILogger 绑定错误。

我在我的解决方案文件中找不到任何对 ILogger 扩展的显式引用。原来罪魁祸首是一个不同的扩展 Microsoft.Extensions.Caching.Memory,它更新到 v5.00 (.NET 5?)。将该包降级到之前的版本 3.1.15 修复了该错误(我最初使用的是 v3.1.4)。我想知道是否有任何 v5.x 扩展包会触发这个问题。

【讨论】:

【参考方案3】:

我必须从解决方案中卸载 Microsoft.Extensions.Logging nuget 包。

【讨论】:

【参考方案4】:

对我来说,我在 Azure 函数引用的项目上使用了 NuGet 包 Microsoft.Extensions.Logging。卸载了这个包,我的错误(这个确切的错误)消失了。 我实际上并不需要 NuGet 包来在我的 Azure 函数中使用 ILogger。

 [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)

编辑:降级到 Microsoft.Extensions.Http 2.1.0 也解决了此错误的另一个问题。如果您仍然需要扩展包(例如对于 IHttpClientFactory),则可能会因为 SDK 版本与 3.1.1 冲突而出现此日志记录错误。

【讨论】:

【参考方案5】:

将 Azure Functions/Durable Functions 从 v2 更新到 v3 时也会发生这种情况。您需要手动编辑 .csproj 以解决 ILogger 引用问题。

<PropertyGroup>
  <TargetFramework>netcoreapp3.1</TargetFramework>
  <AzureFunctionsVersion>v3</AzureFunctionsVersion>   
</PropertyGroup>
<ItemGroup>
    ...
   <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.2" />
</ItemGroup>

该函数将继续报告运行时模块错误。然后,您必须尝试在 Visual Studio 中创建新的 Azure Function v3 项目以下载运行时模块的模板。有关该过程的更多信息,请参见官方文档:Azure Functions runtime versions overview

【讨论】:

【参考方案6】:

同样错误的另一个原因...

不知何故,我最终得到了一个引用 Microsoft.Build.Framework 的 using 语句,它有自己的 ILogger 版本,修复只是用函数应用程序期望的 Microsoft.Extensions.Logging 替换它

【讨论】:

【参考方案7】:

正如一位 MS 员工所说,原因可能是:

我们还不完全支持 .NET Core 2.2,但我们正在进行这项工作,应该会在 1 月份发布。

https://github.com/Azure/azure-functions-host/issues/3854#issuecomment-449034719

【讨论】:

【参考方案8】:

不知何故,我也遇到了同样的错误,但导致问题的是 Microsoft.EntityFrameworkCore.SqlServer 的包版本。

将 Microsoft.EntityFrameworkCore.SqlServer v2.2.0 降级到 v2.1.4 可以解决问题。

我假设此包的 logging.abstractions 库之间存在版本不匹配。

【讨论】:

引用了一个使用 EF 2.2 的项目,删除该引用处理了函数中的错误。 这对我来说是一个巨大的节省时间。感谢发帖! 我可以验证它仍然适用于我相信使用 .NETCore 3.1 的 Azure Function v3 项目。我将我的 EF 包降级到 2.2.0,它可以正常工作。【参考方案9】:

绑定顺序也可能导致此失败。

改变参数顺序...

     [FunctionName("SomeFunction")]
     public static async Task Run([BlobTrigger("path", Connection = "conn")]
        ILogger logger, ExecutionContext context, Stream stream, string name) 

...到...

     [FunctionName("SomeFunction")]
     public static async Task Run([BlobTrigger("path", Connection = "conn")]
        Stream stream, string name, ILogger logger, ExecutionContext context) 

...解决了我的问题。 (Microsoft.NET.Sdk.Functions v1.0.24)

【讨论】:

【参考方案10】:

对我来说,问题是我需要在 .csproj 文件中明确声明 Azure Functions 版本。

我在&lt;TargetFramework&gt; 元素之后添加了&lt;AzureFunctionsVersion&gt;v2&lt;/AzureFunctionsVersion&gt;

<PropertyGroup>
   <TargetFramework>netstandard2.0</TargetFramework>
   <AzureFunctionsVersion>v2</AzureFunctionsVersion>
</PropertyGroup>

希望对某人有所帮助:-)

【讨论】:

【参考方案11】:

可能发生的情况是 SDK 绑定到版本 X 的 ILogger 程序集,而您的用户代码绑定到版本 Y。然后绑定引擎不会将您的参数类型识别为相同,因为它们来自不同的组件。 (这也可能发生在任何其他类型上)。

通常解决方法是:

    查看 SDK 使用的块引用 使用那些现有的引用,不要添加具有不同版本的相同 dll。

【讨论】:

谢谢。问题是我在 SDK 使用 1.1.1 时尝试使用 Logging.Abstractions v2.0.0.0 我相信刚刚发布的 Microsoft.NET.Sdk.Functions 1.0.19 版本使用的是 Microsoft.Extensions.Logging.Abstractions v2.1.0。 这是正确的答案,也是导致我同样错误的原因。更具体地说,我有这个错误 b/c 我的 Azure 函数项目(v2 .Net 核心)引用了我自己的项目,这些项目依赖于 Microsoft.Extensions.Logging v2.2.0 NuGet 包,这导致了 AF 项目的 Microsoft.NET。 Sdk.Functions Nuget 包将其 Microsoft.Extensions.Logging 相关包(其中几个)从默认的 v2.2.1 升级到 v2.2.0。希望这会有所帮助。 就我而言,我需要将Microsoft.Extensions.Logging.Abstractions3.1.0 降级为2.2.0 如果我在 Azure 函数所依赖的另一个程序集中使用 Microsoft.Extensions.Logging 5.0.0,我会遇到 OP 的问题。但是,如果我在另一个程序集中降级到3.1.12,那么一切正常。相当不透明。因为这个问题浪费了相当多的时间。

以上是关于Azure 函数无法绑定 ILogger的主要内容,如果未能解决你的问题,请参考以下文章

Azure 函数无法将参数“messageReceiver”绑定到类型“Microsoft.Azure.ServiceBus.Core.MessageReceiver”

在 Azure 函数 V2 中将 TraceWriter 替换为 ILogger

使用 Azure Function 2.x 通过构造函数为 Http 触发函数注入 ILogger

使用 Azure Function V2 Durable 函数时,ILogger 不记录到 Application Insights

具有输入绑定的 Azure 函数的 Azure 事件中心存储容器配置

Azure 服务总线触发函数 - 绑定到 MessageReceiver