Serilog CloudWatchSink无法从Lambda函数运行

时间:2018-10-25 11:15:23

标签: aws-lambda serilog

我有一个在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软件包:

enter image description here

最后,我为Lambda提供了对CloudWatch Logs的适当访问权限:

enter image description here

我不确定从这里去哪里。如前所述,这在dev(Debug)环境中效果很好。 Lambda不能正常使用,并且SelfLog不会产生错误输出。

有人建议解决此问题吗?感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我实际上是在寻找信息,所以我没有答案,但是我怀疑这仅在本地有效,因为LambdaEntryPoint仅调用Startup类,因此实际上不会调用ConfigureLogging函数是链接到HostBuilder的,而不是像我们以前在.NET Core 1.x中那样从Startup内部调用的。

我本人对此感到疑惑,尽管如此,我还没有答案。