gpt4 book ai didi

.net - 单元测试 serilog 配置

转载 作者:行者123 更新时间:2023-12-03 17:53:24 28 4
gpt4 key购买 nike

我有一段代码用于根据一些自定义配置与托管环境相结合来设置 serilog。例如。应用程序写入开发中的一个接收器和生产中的另一个接收器。

我试图弄清楚如何为这段代码编写测试。基本上,我想编写一个测试,检查仅在环境名称设置为给定值时才添加接收器,并且接收器配置(如日志文件路径)尊重我提供的自定义配置。

但是我没有找到任何从 LoggingConfiguration 中获取值的方法。 ...

任何人都知道这是否可能?

最佳答案

不幸的是,Serilog 没有公开已配置的接收器列表,因此您目前唯一的选择是使用反射。

如果你闲逛Serilog's source code ,你会看到 it groups all configured sinks进入内部类的实例 SafeAggregateSink 它负责将日志发送到不同的接收器设置,并在名为 _sinks 的私有(private)字段中保存一个包含所有已配置接收器的数组.

这是一个简单的例子:

var log = new LoggerConfiguration()
.WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Verbose)
.WriteTo.File(path: "log.txt", restrictedToMinimumLevel: LogEventLevel.Verbose)
.CreateLogger();

var aggregateSinkFieldInfo = log.GetType()
.GetField("_sink", BindingFlags.Instance | BindingFlags.NonPublic);

var aggregateSink = (ILogEventSink)aggregateSinkFieldInfo?.GetValue(log);

var sinkEnumerableFieldInfo = aggregateSink?.GetType()
.GetField("_sinks", BindingFlags.Instance | BindingFlags.NonPublic);

var sinks = (ILogEventSink[])sinkEnumerableFieldInfo?
.GetValue(aggregateSink);

if (sinks != null)
{
foreach (var sink in sinks)
{
Console.WriteLine(sink.GetType().FullName);
}
}

这应该输出:
Serilog.Sinks.SystemConsole.ConsoleSink
Serilog.Sinks.File.FileSink

N.B.:请记住,Serilog 在某些情况下会包裹水槽,因此您可能需要处理这个问题,然后才能找到您正在寻找的水槽。例如,如果你限制了一个 sink 的最低级别,你的 sink 将被包裹在一个 RestrictedSink 中。 ,所以你必须捕获它的 _sink字段来获得您正在寻找的“真正的”水槽。

关于.net - 单元测试 serilog 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52554649/

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