代码之家  ›  专栏  ›  技术社区  ›  Pingpong

Depdency注入和日志记录在正确使用Azure函数时会在没有代码更改的情况下突然失败。

  •  0
  • Pingpong  · 技术社区  · 5 年前

    我有一个项目正在通过构造函数使用依赖项注入,并使用带有Azure函数2.0的ASP.NET核心的MS日志记录,它在本地和Azure上的2.0.12333下工作,现在有两个问题:

    1)通过构造函数引发的依赖项注入异常,该异常在以前工作过。

    2)日志记录不再写入以前工作过的文本文件。

    下面是演示上述问题1的示例代码。

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

    以下例外情况后接示例代码:

    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();            
    
    
            }
        }
    

    主机.json

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

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

    通过构造函数进行依赖项注入时, TestFunctions ,被移除, Test 方法被调用。但是,在 试验 方法未将内容写入文件。

    同样,DI和日志记录都在工作。

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

    内部登录信息 试验 方法

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

    日志记录在 试验 方法未将内容写入文件。

    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'.
    

    与2017年相比

    Azure函数2.x

    0 回复  |  直到 5 年前
        1
  •  2
  •   Pingpong    5 年前

    要修复本地Azure函数的运行时问题,请参阅 Setting Azure Functions Runtime Version for local dev with Visual Studio 2017

    解决方案

    当前版本的Azure函数运行时2.0.12353导致此问题。

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

    其他版本如2.0.12342.0可以工作

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

    FUNCTIONS_EXTENSION_VERSION = 2.0.12342.0