【问题标题】:.Net Core AWS Lambda function not flushing logs.Net Core AWS Lambda 函数不刷新日志
【发布时间】:2019-08-21 07:52:44
【问题描述】:

我使用 AWS Toolkit Extensions 的模板项目结构设置了一个 .NET Core AWS Lambda 函数。该功能按预期工作。我唯一的问题是我的日志并不总是在应用程序关闭之前刷新。我通常会丢失大约一两行日志。我正在使用 AWS Cloudwatch 来存储我的日志并连接到内置的 .NET Core 日志框架。

我认为问题在于记录器会分批推送它的日志,而不是立即发送它们。问题是我的 Lambda 显然在记录器可以发送它的最后一批之前完成,所以有些被遗漏了。

我已尝试将批量推送间隔减少到一秒,但我仍然遇到问题。我还尝试处置我正在使用的服务提供商,希望这会迫使记录器刷新它的日志,但这似乎也没有帮助。

我一直无法找到从 .NET Core 记录器中手动刷新日志的方法。

我真的不想在我的函数末尾添加类似 Thread.Sleep 的东西 - 这很乱,我真的不应该这样做。

这是我的代码:

函数入口:

public class Function
{
    private readonly Startup startup;

    private ServiceProvider serviceProvider;
    private ILogger<Function> logger;

    public Function()
    {
        startup = new Startup();
    }

    public async Task FunctionHandler(SendUnsentBrochuresRequest request, ILambdaContext context)
    {
        serviceProvider = startup.InitializeFunction();
        logger = this.serviceProvider.GetService<ILogger<Function>>();

        try
        {
            this.logger.LogInformation("Beginning function...");
            var service = this.serviceProvider.GetService<SendUnsentBrochuresService>();
            await service.Process(request);
        }
        catch (Exception ex)
        {
            this.logger.LogError(ex, ex.FullExceptionDetails());
        }
        finally
        {
            this.logger.LogInformation("Finished sending unsent brochure requests.");
            this.serviceProvider.Dispose();
        }
    }
}

启动: (使用AWS.Logger.AspNetCorenuget包)

public class Startup
{
    public ServiceProvider InitializeFunction()
    {
        var services = new ServiceCollection();
        var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

        // Config
        var configBuilder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();

        var config = configBuilder.Build();
        services.AddSingleton<IConfiguration>(config);

        var awsCredentials = new BasicAWSCredentials(config["AWS:AccessKey"], config["AWS:SecretKey"]);

        // Logging
        services.AddLogging(builder =>
        {
            var options = new AWSLoggerConfig()
            {
                Credentials = awsCredentials,
                LogGroup = config["AWS:Cloudwatch:LogGroup"],
                Region = "eu-west-2",
                BatchPushInterval = TimeSpan.FromSeconds(1)
            };

            builder.AddFilter("Microsoft", LogLevel.Warning);

            builder.AddAWSProvider(options);
        });

        // Other stuff...

        // Function
        services.AddTransient<SendUnsentBrochuresService>();

        return services.BuildServiceProvider();
    }
}

【问题讨论】:

    标签: c# amazon-web-services asp.net-core logging aws-lambda


    【解决方案1】:

    这个库不适合 Lambda,因为它在后台线程中上传日志。我们确实在回购的自述文件中提到了这一点。 https://github.com/aws/aws-logging-dotnet#aws-lambda

    您是否有理由要使用此库而不是使用 Lambda 中内置的日志记录到 CloudWatch 日志?如果偏好 .NET Core API 和配置,您可以使用 Amazon.Lambda.Logging.AspNetCore,它将日志发送到附加的 LogStream,如 context.Logger.LogLine

    【讨论】:

    • 我对此的主要需求是因为我有各种依赖于ILogger .NET 类的底层库。这些库用于各种应用程序,这些应用程序可能不一定是 Lambda 函数,所以我不想传递 LambdaLogger 实例,因为它没有实现 ILogger,所以我不能在我的依赖注入中使用它。我会看看Amazon.Lambda.Logging.AspNetCore,因为听起来这可能会解决我的问题。感谢您的推荐。
    • 应该Amazon.Lambda.Logging.AspNetCoreTestLambdaLogger 一起工作吗?我对我的 Lambda 函数进行了集成测试,我正在使用 Amazon.Lambda.TestUtilities.TestLambdaLogger 类,但运行测试后,Buffer 属性为空。我已按照此处列出的设置进行操作:github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/…
    • 感谢诺姆。这个包完美地工作。我还没有弄清楚是否有可能在我的测试中使用它,但我现在可以忍受它。
    【解决方案2】:

    Andy,我不是 .Net 开发人员。我希望您了解 AWS Lambda 的限制。 https://docs.aws.amazon.com/lambda/latest/dg/limits.html

    确保函数内存分配和函数超时在限制范围内。

    确保您的 AWS lambda 具有附加的角色,该角色具有在 AWS Cloudwatch 中写入日志的权限

    【讨论】:

    • 谢谢。我可以确认该函数有权将日志写入 Cloudwatch。它只是丢失了一两行日志,而不是所有内容。另外,我已经为我的 Lambda 函数分配了 1GB 的内存,这对于它正在做的事情来说已经绰绰有余了。它通常只使用 100-200MB。
    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2020-06-04
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多