我有一个在AWS Lambda中运行的.NET Core 2 WebAPI应用程序。我正在使用Serilog AwsCloudWatch接收器。我还从Datalust SerilogMiddleware example实现了中间件。
这一切在我的开发环境中都可以正常工作(日志已写入正确的CloudWatch Log Group)。但是,当应用程序在Lambda中运行时,不会发生任何日志记录。我已启用Serilog SelfLog,但是没有记录任何错误,因此我不认为这是AWS凭证问题。
这是我的日志记录配置:
private Serilog.Core.Logger ConfigureLogger(IHostingEnvironment env)
{
Serilog.Debugging.SelfLog.Enable(Console.Error);
// Base configuration
var logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("System", LogEventLevel.Warning)
.Enrich.FromLogContext()
.Enrich.WithMachineName()
.Enrich.WithThreadId();
// Configure Sink: AWS CloudWatch
var cloudWatchLogsClient = new AmazonCloudWatchLogsClient("ACCESS_KEY_ID", "SECRET_ACCESS_KEY", RegionEndpoint.GetBySystemName(awsConfig.CloudWatchRegion));
var logLevel = env.IsProduction() ? LogEventLevel.Information : LogEventLevel.Debug;
logger.WriteTo.AmazonCloudWatch(new CloudWatchLogSinkOptions(env, logLevel), cloudWatchLogsClient);
// Configure Sink: Console (only for Debug environment)
if (env.IsDebug())
{
logger.WriteTo.Console(LogEventLevel.Debug);
}
return logger.CreateLogger();
}
这是CloudWatchSinkOptions的实现:
public class CloudWatchLogSinkOptions : ICloudWatchSinkOptions
{
public CloudWatchLogSinkOptions(IHostingEnvironment env, LogEventLevel level = LogEventLevel.Information)
{
LogGroupName += env.EnvironmentName;
MinimumLogEventLevel = level;
}
#region Settings
public LogEventLevel MinimumLogEventLevel { get; set; }
public int BatchSizeLimit { get; set; } = 100;
public TimeSpan Period { get; set; } = TimeSpan.FromSeconds(10);
public LogGroupRetentionPolicy LogGroupRetentionPolicy { get; set; } = LogGroupRetentionPolicy.OneYear;
public bool CreateLogGroup { get; set; } = true;
public string LogGroupName { get; set; } = "WebApi-ApplicationLog/";
public ILogStreamNameProvider LogStreamNameProvider { get; set; } = new DefaultLogStreamProvider();
public ITextFormatter TextFormatter { get; set; }= new SerilogTextFormatter();
public byte RetryAttempts { get; set; } = 5;
public int QueueSizeLimit { get; set; }
#endregion
#region Defaults
public const LogEventLevel DefaultMinimumLogEventLevel = LogEventLevel.Information;
public const int DefaultBatchSizeLimit = 100;
public const bool DefaultCreateLogGroup = true;
public const byte DefaultRetryAttempts = 5;
public static readonly TimeSpan DefaultPeriod = TimeSpan.FromSeconds(10);
#endregion
}
我相信我已经包含了所有必需的Serilog软件包:
最后,我为Lambda提供了对CloudWatch Logs的适当访问权限:
我不确定从这里去哪里。如前所述,这在dev(Debug)环境中效果很好。 Lambda不能正常使用,并且SelfLog不会产生错误输出。
有人建议解决此问题吗?感谢您的帮助!
答案 0 :(得分:0)
我实际上是在寻找信息,所以我没有答案,但是我怀疑这仅在本地有效,因为LambdaEntryPoint仅调用Startup类,因此实际上不会调用ConfigureLogging函数是链接到HostBuilder的,而不是像我们以前在.NET Core 1.x中那样从Startup内部调用的。
我本人对此感到疑惑,尽管如此,我还没有答案。