本文介绍了与Azure Functions一起正常运行时,依赖代码注入和日志记录突然突然失败,而无需更改代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个项目正在通过带有Azure函数2.0的ASP.NET Core通过构造函数和MS Logging使用依赖项注入,该项目在本地和Azure下在2.0.12333下工作,现在存在以下两个问题:

I have a project that is using dependency injection via constructor and MS Logging from ASP.NET Core with Azure Function 2.0, which was working under 2.0.12333 locally and on Azure, and now have two issues below:

1)之前通过构造函数注入的依赖项引发异常.

1) Exception thrown for dependency injection via constructor, which was working before.

2)日志记录不再写入以前正在工作的文本文件.

2) Logging is no longer writing to a text file, which was working before.

下面是一个示例代码,演示了上面的问题1.

Below is a sample code that demos the issue 1 above.

1)通过构造函数注入依赖项引发异常

下面的代码段,后跟示例代码:

Excepton below followed by sample code:

2019-03-15T01:28:45.311 [Error] Executed 'Test' (Failed, Id=6bdb0e8e-2353-4ed2-83ce-2a5288fd124d)
System.InvalidOperationException : Unable to resolve service for type 'ICar' while attempting to activate 'TestFunctions'.
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired)
   at lambda_method(Closure ,IServiceProvider ,Object[] )
   at Microsoft.Azure.WebJobs.Host.Executors.DefaultJobActivator.CreateInstance[T](IServiceProvider serviceProvider) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\DefaultJobActivator.cs : 42
   at Microsoft.Azure.WebJobs.Host.Executors.DefaultJobActivator.CreateInstance[T](IFunctionInstanceEx functionInstance) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\DefaultJobActivator.cs : 32
   at Microsoft.Azure.WebJobs.Host.Executors.ActivatorInstanceFactory`1.<>c__DisplayClass1_1.<.ctor>b__0(IFunctionInstanceEx i) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\ActivatorInstanceFactory.cs : 20
   at Microsoft.Azure.WebJobs.Host.Executors.ActivatorInstanceFactory`1.Create(IFunctionInstanceEx functionInstance) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\ActivatorInstanceFactory.cs : 26
   at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`2.CreateInstance(IFunctionInstanceEx functionInstance) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionInvoker.cs : 44
   at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ParameterHelper.Initialize() at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs : 845
   at async Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.TryExecuteAsyncCore(IFunctionInstanceEx functionInstance,CancellationToken cancellationToken) at C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs : 116

下面的示例代码:

 public class TestFunctions
    {
        private readonly ICar _car;
        private readonly ILogger _log;
        private const string RouteTemplate = "";

        public TestFunctions(
            ICar car, 
            ILoggerFactory loggerFactor)
        {
            _car = car;
            _log = loggerFactor.CreateLogger<TestFunctions>();

        }

        [FunctionName(nameof(Test))]
        public IActionResult Test(
            [HttpTrigger(AuthorizationLevel.Anonymous,"Get","post", Route = RouteTemplate + nameof(Test))]
            HttpRequest httpRequest, ExecutionContext context)
        {
            _log.LogInformation($"{nameof(Test)} started processing the request.");
            return new ContentResult { StatusCode = 200, Content = $"OK" };
        }

    }

    public interface ICar
    {
        string Name { get; }
    }

    public class Car : ICar
    {
        public string Name { get => "car name"; }
    }

[assembly: WebJobsStartup(typeof(WebJobsStartup))]
    public class WebJobsStartup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            builder.Services.AddHttpClient();
            builder.Services.AddSingleton<ICar, Car>();
            builder.Services.AddLogging();            


        }
    }

host.json

host.json

{
  "version": "2.0",
  "extensions": {
    "http": {
      "routePrefix": "api/v1"
    }
  },
  "logging": {
    "fileLoggingMode": "always",
    "logLevel": {
      "default": "Information"
    }

  }
}

2)记录不再写入文本文件

当通过构造函数TestFunctions进行的依赖项注入被删除时,将调用Test方法.但是,Test方法中的日志记录并未将内容写入文件.

When dependency injection via constructor, TestFunctions, is removed, the Test method is invoked. However, the logging within the Test method is not writing content to file.

同样,DI和日志记录之前都可以工作.

Again, both DI and logging were working before.

 public TestFunctions(
            //ICar car, 
            ILoggerFactory loggerFactor)
        {}

Test方法中的LogInformation

LogInformation within Test method

_log.LogInformation($"{nameof(Test)} started processing the request.");

Test方法中的日志记录未将内容写入文件.

the logging within the Test method is not writing content to file.

2019-03-15T01:34:56.360 [Information] Initializing Host. 2019-03-15T01:34:56.371 [Information] Host initialization: ConsecutiveErrors=0, StartupCount=1 2019-03-15T01:34:56.440 [Information] ApplicationInsightsLoggerOptions {   "SamplingSettings": {
    "EvaluationInterval": "00:00:15",
    "InitialSamplingPercentage": 100.0,
    "MaxSamplingPercentage": 100.0,
    "MaxTelemetryItemsPerSecond": 5.0,
    "MinSamplingPercentage": 0.1,
    "MovingAverageRatio": 0.25,
    "SamplingPercentageDecreaseTimeout": "00:02:00",
    "SamplingPercentageIncreaseTimeout": "00:15:00"   },   "SnapshotConfiguration": null } 2019-03-15T01:34:56.441 [Information] LoggerFilterOptions {   "MinLevel": "None",   "Rules": [
    {
      "ProviderName": null,
      "CategoryName": null,
      "LogLevel": null,
      "Filter": "<AddFilter>b__0"
    },
    {
      "ProviderName": null,
      "CategoryName": null,
      "LogLevel": "Information",
      "Filter": null
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.SystemLoggerProvider",
      "CategoryName": null,
      "LogLevel": "None",
      "Filter": null
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.SystemLoggerProvider",
      "CategoryName": null,
      "LogLevel": null,
      "Filter": "<AddFilter>b__0"
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider",
      "CategoryName": null,
      "LogLevel": "Trace",
      "Filter": null
    }   ] } 2019-03-15T01:34:56.441 [Information] LoggerFilterOptions {   "MinLevel": "None",   "Rules": [
    {
      "ProviderName": null,
      "CategoryName": null,
      "LogLevel": null,
      "Filter": "<AddFilter>b__0"
    },
    {
      "ProviderName": null,
      "CategoryName": null,
      "LogLevel": "Information",
      "Filter": null
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.SystemLoggerProvider",
      "CategoryName": null,
      "LogLevel": "None",
      "Filter": null
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics.SystemLoggerProvider",
      "CategoryName": null,
      "LogLevel": null,
      "Filter": "<AddFilter>b__0"
    },
    {
      "ProviderName": "Microsoft.Azure.WebJobs.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider",
      "CategoryName": null,
      "LogLevel": "Trace",
      "Filter": null
    }   ] } 
2019-03-15T01:34:56.441 [Information] FunctionResultAggregatorOptions
{
  "BatchSize": 1000,
  "FlushTimeout": "00:00:30",
  "IsEnabled": true
}
2019-03-15T01:34:56.441 [Information] SingletonOptions
{
  "LockPeriod": "00:00:15",
  "ListenerLockPeriod": "00:00:15",
  "LockAcquisitionTimeout": "10675199.02:48:05.4775807",
  "LockAcquisitionPollingInterval": "00:00:05",
  "ListenerLockRecoveryPollingInterval": "00:01:00"
}
2019-03-15T01:34:56.448 [Information] Starting JobHost
2019-03-15T01:34:56.451 [Information] Starting Host (HostId=My-azureportal, InstanceId=id, Version=2.0.12353.0, ProcessId=5772, AppDomainId=1, InDebugMode=True, InDiagnosticMode=False, FunctionsExtensionVersion=~2)
2019-03-15T01:34:56.488 [Information] Loading functions metadata
2019-03-15T01:34:56.645 [Information] 1 functions loaded
2019-03-15T01:34:56.810 [Information] Generating 1 job function(s)
2019-03-15T01:34:56.868 [Information] Found the following functions:
TestFunctions.Test
2019-03-15T01:34:56.868 [Information] Host initialized (410ms)
2019-03-15T01:34:56.877 [Information] Host started (418ms)
2019-03-15T01:34:56.877 [Information] Job host started
2019-03-15T01:34:57.324 [Information] Executing 'Test' (Reason='This function was programmatically called via the host APIs.', Id=my id)
2019-03-15T01:34:57.370 [Information] Executed 'Test' (Succeeded, Id=my id)
2019-03-15T01:35:02.019 [Information] Host lock lease acquired by instance ID 'id'.

VS 2017

Azure功能2.x

Azure Functions 2.x

推荐答案

要解决本地Azure Functions的运行时问题,请参阅

To fix the runtime issue with local Azure Functions, see Setting Azure Functions Runtime Version for local dev with Visual Studio 2017

解决方案

当前版本的Azure Functions运行时2.0.12353会导致此问题.

The current version of Azure Functions Runtime 2.0.12353 causes the issue.

https://github.com/Azure/azure-functions-host/releases

其他版本(如2.0.12342.0)有效

Other version like 2.0.12342.0 works

在功能"应用程序设置下,设置如下

Under Functions App Settings, set below

FUNCTIONS_EXTENSION_VERSION = 2.0.12342.0

这篇关于与Azure Functions一起正常运行时,依赖代码注入和日志记录突然突然失败,而无需更改代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-03 03:33