Каждый метод в функциях Azure может содержать Microsoft.Extensions.Logging.ILogger
для ведения журнала.Используя WebJobsStartup
с классом запуска, вы можете изменить ведение журнала на Serilog, используя следующий синтаксис:
[assembly: WebJobsStartup(typeof(Startup))]
namespace MyFuncApp {
public class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder)
{
builder.Services.AddLogging(
lb => lb.ClearProviders()
.AddSerilog(
new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File(@"C:\Temp\MyFuncApp.log")
.CreateLogger(),
true));
}
}
}
Я также могу добавлять другие объекты в DI и вставлять их либо в методы, либо в конструктордля класса, содержащего методы, использующие, например, builder.Services.AddSingleton<IMyInterface, MyImplementation>();
. Однако мне бы очень хотелось иметь возможность вводить Microsoft.Extensions.Logging.ILogger
таким же образом, но если я попытаюсь использовать ILogger
вконструктор Я получаю следующую ошибку во время вызова метода (например, при создании класса):
Microsoft.Extensions.DependencyInjection.Abstractions: Невозможно разрешить службу для типа 'Microsoft.Extensions.Logging.ILogger'при попытке активировать' MyFuncApp.MyFunctions '.
Итак, есть ли способ ввести ILogger
в конструктор класса, подобный этому?
public class MyFunctions
{
private IMyInterface _myImpl;
private ILogger _log;
public MyFunctions(
IMyInterface myImplememtation, // This works
ILogger log) // This does not
{
_myImpl = myImplementation;
_log = log;
_log.LogInformation("Class constructed");
}
public async Task<IActionResult> Function1([HttpTrigger() ... ) {
_log.LogInformation("Function1 invoked");
}
}