gpt4 book ai didi

c# - Serilog 与 .NET Core AWS 无服务器 Web API 项目

转载 作者:太空宇宙 更新时间:2023-11-03 12:08:55 27 4
gpt4 key购买 nike

我有一个使用 .NET Core (2.1) 构建的 AWS 无服务器 API 应用程序。我已经使用 Serilog 日志记录设置了它,它使用 AWS Cloudwatch 接收器作为它的日志记录目的地。该项目依赖于核心逻辑所在的共享类库。

我注意到并非我所有的日志消息都进入了 Cloudwatch。我的 API Controller 中的消息确实已成功记录,但来自共享类库的消息仅在我在本地运行时才被记录,而不是在使用实时 API 时。

这是我在启动时的日志记录设置。

var awsCredentials = new BasicAWSCredentials(config["AWS:AccessKey"], config["AWS:SecretKey"]);
if (env.IsProduction())
{
var options = new CloudWatchSinkOptions
{
LogGroupName = config["AWS:Cloudwatch:LogGroup"],
LogStreamNameProvider = new LogStreamNameProvider(),
TextFormatter = new Serilog.Formatting.Json.JsonFormatter()
};

var client = new AmazonCloudWatchLogsClient(awsCredentials, RegionEndpoint.EUWest2);
Log.Logger = new LoggerConfiguration()
.Enrich.WithExceptionDetails()
.WriteTo
.AmazonCloudWatch(options, client)
.CreateLogger();
}

services.AddSingleton(Log.Logger);

我也尝试过添加 services.AddLogging(builder => builder.AddSerilog()); 但这没有帮助。

我是这样使用它的:

public class TestService
{
private readonly ILogger logger;

public TestService(ILogger logger)
{
this.logger = logger;
}

public void TestMethod()
{
this.logger.Information("Test Message");
}
}

最佳答案

默认的依赖注入(inject)框架有几个限制。在 Controller 内部,依赖项将通过放置在构造函数中自动加载。但是,在嵌套类中你必须传递依赖本身,否则框架不会自动解析。该框架在组合根的假设下工作。本质上:

// Auto Resolved:
public class SampleController : Controller
{
private readonly ILogger logger;

public SampleController(ILogger logger) => this.logger = logger;

public IActionResult Index()
{
logger.Information("...");
..
}
}

// Will not auto resolve
public class SampleService
{
private readonly ILogger logger;

public SampleService(ILogger logger) => this.logger = logger;

public void SampleAction()
{
logger.Information("...");
..
}
}

为了在 SampleService 中正确实现记录器,您需要按照以下几行做一些事情:

// Logger as property
Logger = serviceProvider.GetService<ILogger>();
var sampleService = new SampleService(Logger);

// Called directly passed
var sampleService = new SampleService(serviceProvider.GetService<ILogger>());

这是我的经验,否则将无法使用您传递的定义实现。可能有一些我没有的信息也可能会影响您的代码。

关于c# - Serilog 与 .NET Core AWS 无服务器 Web API 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53398204/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com