对于我的 ASP.NET 5 Web 项目,我想通过 Serilog 登录到 Application Insights。现在我终于把一切都搞定了,但我不敢相信这是他们要走的路。我希望你能帮助我改进它。
我看到的主要问题是 Application Insights 的 Instrumentation Key 都是在 appsettings.json 的 Serilog 和 ApplicationInsights 部分中配置的。我希望 Serilog 使用默认/活动客户端(和配置),但它似乎根据自己的配置创建第二个客户端。
https://github.com/serilog/serilog-sinks-applicationinsights上的文档说:
如上所述,您还可以传递检测密钥,但不鼓励这样做
如果我从 appsettings.json 的 Serilog 部分中删除 InstrumentationKey 设置,它不会再将任何 Serilog 语句记录到 Application Insights。为了解决这个问题,我看到你可以使用.WriteTo.ApplicationInsights(TelemetryConfiguration.Active, TelemetryConverter.Traces),但我不想要硬编码配置,更喜欢通过 appsettings.json 来完成。另外,我担心有两个客户端/配置,不会提供最佳性能。
现在,有没有什么方法可以通过 appsettings.json 进行配置,而不必复制检测密钥?
程序.cs
public static void Main(string[] args)
{
LoggingExtensions.SetupLoggerConfiguration(AppName, AppVersion);
try
{
Log.Information("Starting web host for {0}", AppName);
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public …Run Code Online (Sandbox Code Playgroud) 我已经开始开发 Azure Functions,现在我想创建我的第一个单元/集成测试,但我完全卡住了。虽然我有一个非常简单的函数,带有 HTTP 触发器和 HTTP 和存储队列输出,但测试它似乎非常复杂。
代码(简化):
public class MyOutput
{
[QueueOutput("my-queue-name", Connection = "my-connection")]
public string QueueMessage { get; set; }
public HttpResponseData HttpResponse { get; set; }
}
public static class MyFunction
{
[Function(nameof(MyFunction))]
public static async Task<MyOutput> Run(
[HttpTrigger(AuthorizationLevel.Function, "POST")] HttpRequestData req,
FunctionContext executionContext)
{
var logger = executionContext.GetLogger(nameof(MyFunction));
logger.LogInformation("Received {Bytes} bytes", req.Body.Length);
//implementation
}
}
Run Code Online (Sandbox Code Playgroud)
现在我希望构建一个这样的测试:
public async Task Test()
{
var response = await MyFunction.Run(..., ...);
Assert.IsNotNull(response);
}
Run Code Online (Sandbox Code Playgroud)
在互联网上找了几个小时找到一个好的方法后,我仍然没有找到一种方法来模拟HttpRequestData和FunctionContext. 我还通过设置服务器来寻找完整的集成测试,但这似乎非常复杂。我最终得到的唯一结果是: …