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) Exception thrown for dependency injection via constructor, which was working before.
2) Logging is no longer writing to a text file, which was working before.
Below is a sample code that demos the issue 1 above.
1) Exception thrown for dependency injection via constructor
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
Sample code below:
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
{
"version": "2.0",
"extensions": {
"http": {
"routePrefix": "api/v1"
}
},
"logging": {
"fileLoggingMode": "always",
"logLevel": {
"default": "Information"
}
}
}
2) Logging is no longer writing to a text file
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.
Again, both DI and logging were working before.
public TestFunctions(
//ICar car,
ILoggerFactory loggerFactor)
{}
LogInformation within Test
method
_log.LogInformation($"{nameof(Test)} started processing the request.");
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 Functions 2.x