Azure函数无法绑定ILogger

时间:2018-01-25 23:19:13

标签: azure azure-functions azure-functions-runtime

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

  

[1/25/2018 11:14:46 PM] Microsoft.Azure.WebJobs.Host:错误索引   方法' TrainingFunction.Run'。 Microsoft.Azure.WebJobs.Host:不能   绑定参数' log'输入ILogger。确保参数Type为   由绑定支持。如果您正在使用绑定扩展程序(例如   ServiceBus,计时器等)确保您已注册   启动代码中的扩展方法(例如   config.UseServiceBus(),config.UseTimers()等。)。

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

10 个答案:

答案 0 :(得分:17)

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

一般来说,解决方法是:

  1. 请参阅SDK使用的块金引用
  2. 使用这些现有引用,不要使用不同版本添加相同的dll。

答案 1 :(得分:7)

我也有同样的错误,但是导致问题的是Microsoft.EntityFrameworkCore.SqlServer的软件包版本。

可以将Microsoft.EntityFrameworkCore.SqlServer v2.2.0降级到v2.1.4。

我认为此软件包的logging.abstractions库之间版本不匹配。

答案 2 :(得分:4)

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

我在<AzureFunctionsVersion>v2</AzureFunctionsVersion>元素后添加了<TargetFramework>

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

希望可以帮助某人:-)

答案 3 :(得分:2)

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

从参数顺序更改...

     [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)

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

  

我们还不支持.NET Core 2.2,但是我们正在进行中,应该在1月份发布。

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

答案 6 :(得分:0)

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

不知何故,我最终得到了一个引用# results with 100 rows %timeit original() #100 loops, best of 3: 7 ms per loop %timeit WeNYoBen() #100 loops, best of 3: 2.4 ms per loop %timeit jezrael() #100 loops, best of 3: 4.03 ms per loop %timeit piRSquared() #100 loops, best of 3: 2.29 ms per loop # results with 10000 rows %timeit original() #100 loops, best of 3: 16.6 ms per loop %timeit WeNYoBen() #10 loops, best of 3: 23 ms per loop %timeit jezrael() #100 loops, best of 3: 6.14 ms per loop %timeit piRSquared() #100 loops, best of 3: 19.1 ms per loop 的using语句,该语句具有自己的ILogger版本,该修补程序只是将其替换为功能应用程序期望的Microsoft.Build.Framework

答案 7 :(得分:0)

将Azure 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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

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