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的主要内容,如果未能解决你的问题,请参考以下文章