[英].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.