【问题标题】:Azure Function fails to bind ILoggerAzure 函数无法绑定 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)

【问题讨论】:

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


    【解决方案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。然后绑定引擎不会将您的参数类型识别为相同,因为它们来自不同的组件。 (这也可能发生在任何其他类型上)。

                      通常解决方法是:

                      1. 查看 SDK 使用的块引用
                      2. 使用那些现有的引用,不要添加具有不同版本的相同 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,那么一切正常。相当不透明。因为这个问题浪费了相当多的时间。
                      猜你喜欢
                      • 2023-04-09
                      • 2021-08-16
                      • 2023-03-07
                      • 1970-01-01
                      • 2021-12-30
                      • 2018-03-30
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多