如何设置 DI 以在具有单个 lambda FunctionHandler 的 lambda 函数应用程序中注入 ILogger<T>

joe*_*oey 4 dependency-injection amazon-cloudwatch .net-core aws-lambda

我有一个带有 csproj 的 MRE lambda 项目

<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>
Run Code Online (Sandbox Code Playgroud)

我创建了一个简单的函数处理程序,它调用 _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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该服务代码只是尝试使用 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,将此 lambda 函数处理程序部署到 AWS Lambda 后,CloudWatch 中不会创建任何日志。我错过了什么?

joe*_*oey 8

解决方案如下所示 在此处输入图片说明

还需要确保安装了这个包

<PackageReference Include="Amazon.Lambda.Logging.AspNetCore" Version="3.0.1" />
Run Code Online (Sandbox Code Playgroud)

  • 所以这对我来说在普通的 lambda 中不起作用。它可以在设置为 aspnetcore 代理集成的 lambda 中工作,但当我的触发器是发电机流或 sws 时则不行 (2认同)