【发布时间】: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