簡體   English   中英

.Net Core AWS Lambda函數不刷新日志

[英].Net Core AWS Lambda function not flushing logs

我已經使用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.AspNetCore nuget包)

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();
    }
}

該庫不適合Lambda,因為它在后台線程中上載了日志。 我們確實在自述文件中針對倉庫進行了說明。 https://github.com/aws/aws-logging-dotnet#aws-lambda

與使用Lambda內置到CloudWatch日志的日志相比,您是否有理由要使用此庫? 如果它是.NET Core API和配置的首選項,則可以使用Amazon.Lambda.Logging.AspNetCore ,它將把日志發送到附加的Amazon.Lambda.Logging.AspNetCore ,例如context.Logger.LogLine

安迪,我不是.Net開發人員。 希望您知道AWS Lambda的局限性。 https://docs.aws.amazon.com/lambda/latest/dg/limits.html

確保功能內存分配和功能超時在限制之內。

確保您的AWS Lambda具有附加的角色,並具有在AWS Cloudwatch中寫入日志的權限

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM