多项目解决方案的一个记录器

One logger for a multi-project solution

我正在将 Serilog 集成到我创建的现有多 class 层和多程序集解决方案中。我以前使用的日志记录技术只是简单地将字符串向上传递到包含事件的层。我想摆脱这个。

我读到我可以使用 app.config 文件将记录器配置加载到我的库中的每个 class 中,但是我如何在多程序集项目中执行此操作。

我有一个顶级/启动项目和两个 class 库项目。我想在整个程序中使用同一个记录器和两个接收器。

这些是我目前找到的文章

https://github.com/serilog/serilog/wiki/AppSettings

http://nblumhardt.com/2014/04/xml-configuration-for-serilog/

有人可以解释一下如何完成这个吗?

Serilog 允许您为每个程序使用记录器配置;尽管可以 class-by-class 调整日志记录,但这通常是在事后通过过滤等进行的。

推荐的方法是:

将 Serilog 设置为 Program.Main() 中的第一件事,或者您应用程序的入口点是:

Log.Logger = new LoggerConfiguration()
  .WriteTo.Sink1()
  .WriteTo.Sink2()
  .CreateLogger();

注意这会设置静态 Log class。在您应用的其他地方,您现在可以写:

Log.Information("This is a message");

消息将传递给两个接收器。您可以避免使用静态 Log 而是传递 ILogger,但除非您在这里有强烈的偏好,否则使用静态选项比较麻烦。

XML/appSettings 配置不会改变任何这些。它只是将一些细节移动到配置文件中,因此将第一段代码更改为:

Log.Logger = new LoggerConfiguration()
  .ReadFrom.AppSettings()
  .CreateLogger();

并添加:

<add key="serilog:write-to:Sink1" />
<add key="serilog:write-to:Sink2" />

App.config会有同样的效果。如果可以避免 XML.

,代码中的配置通常不会那么麻烦(移动部件更少)

这是我对多程序集日志记录的解决方案:

我在主程序集(即负责创建和配置日志的程序集)中像往常一样使用配置设置 Mainlogger。在我的例子中,logging-master 是一个 GUI 应用程序,它与一个 dll 交互,它实际上完成了工作。

然后我在slave-assembly中安装了Serilog,并像这样向master assembly暴露了一个订阅函数:

void SubscribeLogging(ILogger masterlogger)
{
    Log.Logger = new LoggerConfiguration()
          .MinimumLevel.Debug()
          .WriteTo.Logger(masterlogger)
          .CreateLogger();
}

我会在必要时从主程序集调用

myDll.SubscribeLogging(Log.ForContext("SourceContext", "myDll"));

据我所知,可以在一定程度上操纵日志配置,但我没有尝试在从属组件中使用完全不同的输出模板。