Как настроить DI для внедрения ILogger <T>в приложение лямбда-функции с одним лямбда-обработчиком FunctionHandler - PullRequest
0 голосов
/ 05 августа 2020

У меня есть лямбда-проект MRE с csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
    <AWSProjectType>Lambda</AWSProjectType>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Amazon.Lambda.Core" Version="1.1.0" />
    <PackageReference Include="Amazon.Lambda.Logging.AspNetCore" Version="3.0.1" />
    <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.6" />
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.6" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.6" />
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.6" />
  </ItemGroup>
</Project>

И я создал простой обработчик функций, который вызывает _svc.DoSomethingThatLogsUsingLogger();

, как показано ниже

using Amazon.Lambda.Core;
using AWSLambda3.Services;
using Microsoft.Extensions.DependencyInjection;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace AWSLambda3
{
    public class Function
    {
        private IServiceName1 _svc { get; }

        public Function( IServiceName1 svc)
        {
            _svc = svc;
        }

        public Function()
        {
            var serviceCollection = new ServiceCollection();
            ConfigureServices(serviceCollection);
            serviceCollection.AddLogging();
            var serviceProvider = serviceCollection.BuildServiceProvider();

            _svc = serviceProvider.GetService<IServiceName1>();
        }

        private void ConfigureServices(IServiceCollection serviceCollection)
        {
            serviceCollection.AddTransient<IServiceName1, ServiceName1>();
        }


        public string FunctionHandler(string input, ILambdaContext context)
        {
            _svc.DoSomethingThatLogsUsingLogger();
            return input?.ToString();
        }
    }
}

Этот служебный код просто пытается войти в журнал с помощью ILogger

using Microsoft.Extensions.Logging;
using System;

namespace AWSLambda3.Services
{
    public class ServiceName1 : IServiceName1
    {
        private readonly ILogger<ServiceName1> _logger;
        public ServiceName1(ILogger<ServiceName1> logger)
        {
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
        }
        public void DoSomethingThatLogsUsingLogger()
        {
            _logger.LogTrace("test LogTrace log string");
            _logger.LogDebug("test LogDebug log string");
            _logger.LogInformation("test LogInformation log string");
            _logger.LogWarning("test LogWarning log string");
            _logger.LogError("test LogError log string");
            _logger.LogCritical("test LogCritical log string");
        }
    }
}

. Однако после развертывания этого обработчика лямбда-функции в AWS Lambda журналы не создаются в CloudWatch. Что мне не хватает?

1 Ответ

1 голос
/ 05 августа 2020

Решение показано ниже в diff введите описание изображения здесь

Также необходимо убедиться, что этот пакет установлен

<PackageReference Include="Amazon.Lambda.Logging.AspNetCore" Version="3.0.1" />
...