C# 有没有办法从正确构建的LoggerConfiguration实例获取有效的Serilog json配置(字符串或文件)?

C# 有没有办法从正确构建的LoggerConfiguration实例获取有效的Serilog json配置(字符串或文件)?,c#,.net,configuration,serilog,C#,.net,Configuration,Serilog,上下文,以及我迄今为止所做的尝试… 作为一项策略,我们的应用程序从appsetting.json配置日志记录。 我正在使用以下代码: // configuration variable is properly built with ConfigurationBuilder Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .CreateLogger(); 当我尝试向配置中添

上下文,以及我迄今为止所做的尝试…

作为一项策略,我们的应用程序从appsetting.json配置日志记录。 我正在使用以下代码:

// configuration variable is properly built with ConfigurationBuilder
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();
当我尝试向配置中添加新内容(enricher、destructure、filter等)时,总是很难做到,因为大多数示例、入门和文档都使用
LoggerConfiguration
类的流畅API

我可以使用IDE intellisense轻松复制这些示例,以实现我的目标,但不幸的是,我必须编写一个有效的json配置文件,这并不总是简单明了的

我的想法是,在一个POC项目中创建配置运行时,然后以某种方式序列化构建的
LoggerConfiguration
实例,因此我将有一个示例serilog json配置文件

不幸的是,我找不到
ReadFrom.Configuration(…)
操作的倒数。 我还尝试用以下代码(使用System.Text.Json)简单地序列化构建的
LoggerConfiguration

但这会导致一个主要为空的json(这也是一个难题,如何解决)

问题


因此问题依然存在:有没有办法从LoggerConfiguration实例获取有效的Serilog json配置(字符串或文件)?

更新:有一个名为的社区项目可以从C#Serilog管道生成
appSettings.json
app.config
的内容。太酷了


Serilog中没有任何内置功能允许您这样做,您也无法简单地将
LogConfiguration
序列化为您所想的文本,因为大多数配置不是存储在简单变量中,而是存储在创建管道期间创建的lambda函数中

无论哪种方式,都必须使用反射来检查任何已配置的接收器及其属性。您可以在此答案上看到一个相关示例:

也就是说,我个人认为使用fluent API是一个不错的选择,而不是使用JSON配置(或XML app.config),因为迟早你会想要创建一些接收器,和/或使用谓词或函数来配置管道的某些方面(例如,to),这将非常困难(在某些情况下是不可能的)无论如何都要在JSON/XML配置中进行配置


您可以使用配置您认为可能需要通过配置更改的小部分(如URL、日志记录级别等),其余部分使用fluent API结合。

据我所知,没有一个,但是如果您编写了一个,那就太棒了。这个问题来自于它如何读取json,据我所知,它在运行时使用了一些运行时愚蠢的方法来解析插件ect的参数,并将这些参数输入到许多thx中以获得答案。很高兴知道我不是唯一一个有极客想法的人。看起来他们设计得有些过头了,但是插件+大量扩展方法的使用+反射很难看到。那些东西,比如静力学或反射,迟早都会反弹,我们必须为此付出代价。是的,这不是一项不可能的任务,从我所知道的工作原理来看,这只是一个简单的反射-分辨率模式,事实上,配置就像轮盘赌,你只需试着看着它不起作用,或者做你自己的扩展。这将是一个好机会thing@g.pickardou请参阅我关于可以从C#codeWow,thx生成
appSettings.json
的更新答案,以获取更新
var loggerConfigurarion = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .Enrich.WithThreadName()
    .Enrich.WithProperty(ThreadNameEnricher.ThreadNamePropertyName, "Unknown");
var myHope = JsonSerializer.Serialize(loggerConfigurarion, new JsonSerializerOptions {WriteIndented = true});
{
  "WriteTo": {},
  "AuditTo": {},
  "MinimumLevel": {},
  "Enrich": {},
  "Filter": {},
  "Destructure": {},
  "ReadFrom": {}
}