使用 3.1 在 aws lambda 中乱序写入日志的 ConsoleLogger
ConsoleLogger writing logs out of order in aws lambda with 3.1
我们有一个带有 .net core 3.1 的 AWS lambda,我们使用依赖注入来添加一些服务,其中一个服务是 ConsoleLogger,我们像这样注入记录器:
private void ConfigureServices(IServiceCollection services)
{
this.Configuration = new ConfigurationBuilder().AddEnvironmentVariables().Build();
services.AddOptions();
services.AddLogging(builder =>
{
builder.AddConsole((x) =>
{
x.DisableColors = true;
x.Format = Microsoft.Extensions.Logging.Console.ConsoleLoggerFormat.Systemd;
});
});
// more services
}
然后在函数中我们这样使用记录器:
[LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
public async Task Handle(ILambdaContext lambdaContext)
{
var logger = this.ServiceProvider.GetService<ILogger<MyClass>>();
string startTime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture);
logger.LogInformation($"Start Time stamp:{startTime}|AwsRequestId:{lambdaContext.AwsRequestId}");
// more work
logger.LogInformation("processing x");
// more work
string endTime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture);
logger.LogInformation($"End Time stamp:{endTime}|AwsRequestId:{lambdaContext.AwsRequestId}");
}
问题是在 cloudwatch 中日志是乱序的
连费用的报告都在我进入之前。
有没有办法避免这种情况?
谢谢
不,我认为您无法使用 CloudWatch 做到这一点。 CloudWatch 保证交付,而不是及时交付。您可以设置一个 Dynamo 或 ElasticSearch 数据库,并将带有时间戳的日志消息写入数据库。在检索时,您可以按时间戳排序。与 CloudWatch 相比,这还可以让您更好地控制消息过滤。
ConsoleLogger
在内部队列中缓冲消息,因此它们可能在那里被延迟,这与 CloudWatch 无关。亚马逊自己的 CloudWatch 日志库做同样的事情,他们在自己的文档中指出这可能是 Lambdas 的问题:https://github.com/aws/aws-logging-dotnet/#aws-lambda
他们推荐的解决方案是使用不做任何缓冲的Amazon.Lambda.Logging.AspNetCore。
我们有一个带有 .net core 3.1 的 AWS lambda,我们使用依赖注入来添加一些服务,其中一个服务是 ConsoleLogger,我们像这样注入记录器:
private void ConfigureServices(IServiceCollection services)
{
this.Configuration = new ConfigurationBuilder().AddEnvironmentVariables().Build();
services.AddOptions();
services.AddLogging(builder =>
{
builder.AddConsole((x) =>
{
x.DisableColors = true;
x.Format = Microsoft.Extensions.Logging.Console.ConsoleLoggerFormat.Systemd;
});
});
// more services
}
然后在函数中我们这样使用记录器:
[LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
public async Task Handle(ILambdaContext lambdaContext)
{
var logger = this.ServiceProvider.GetService<ILogger<MyClass>>();
string startTime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture);
logger.LogInformation($"Start Time stamp:{startTime}|AwsRequestId:{lambdaContext.AwsRequestId}");
// more work
logger.LogInformation("processing x");
// more work
string endTime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture);
logger.LogInformation($"End Time stamp:{endTime}|AwsRequestId:{lambdaContext.AwsRequestId}");
}
问题是在 cloudwatch 中日志是乱序的
连费用的报告都在我进入之前。
有没有办法避免这种情况?
谢谢
不,我认为您无法使用 CloudWatch 做到这一点。 CloudWatch 保证交付,而不是及时交付。您可以设置一个 Dynamo 或 ElasticSearch 数据库,并将带有时间戳的日志消息写入数据库。在检索时,您可以按时间戳排序。与 CloudWatch 相比,这还可以让您更好地控制消息过滤。
ConsoleLogger
在内部队列中缓冲消息,因此它们可能在那里被延迟,这与 CloudWatch 无关。亚马逊自己的 CloudWatch 日志库做同样的事情,他们在自己的文档中指出这可能是 Lambdas 的问题:https://github.com/aws/aws-logging-dotnet/#aws-lambda
他们推荐的解决方案是使用不做任何缓冲的Amazon.Lambda.Logging.AspNetCore。