代码之家  ›  专栏  ›  技术社区  ›  Judy007

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

  •  0
  • Judy007  · 技术社区  · 6 年前

    我和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>
    

    我创建了一个简单的functionhandler调用 _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");
            }
        }
    }
    

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

    0 回复  |  直到 6 年前
        1
  •  9
  •   Judy007    6 年前

    解决方案如下所示 enter image description here

    还需要确保安装了此软件包

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