Serilog в функциях Azure - PullRequest
       28

Serilog в функциях Azure

2 голосов
/ 30 апреля 2019

Каждый метод в функциях 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");
    }
}

1 Ответ

2 голосов
/ 01 мая 2019

Пожалуйста, попробуйте код ниже, он работает на моей стороне:

    [assembly: WebJobsStartup(typeof(Startup))]
    namespace MyApp
 {
        public class Startup : IWebJobsStartup
        {
            public void Configure(IWebJobsBuilder builder)
            {
                //other code

                builder.Services.AddLogging();
            }
        }



    public class Functions
    {
        //other code
        private ILogger _log;

        public Functions(ILoggerFactory loggerFactory)
        {
            _log = loggerFactory.CreateLogger<Functions>();
        }

        [FunctionName("Token")]
        public async Task<IActionResult> Function1(
            [HttpTrigger()]...)
        {
               _log.LogInformation("Function1 invoked");
        }
    }

}
...