【问题标题】:One logger for a multi-project solution用于多项目解决方案的一个记录器
【发布时间】:2016-02-27 17:21:56
【问题描述】:

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

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

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

这些是我目前找到的文章

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

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

有人能解释一下如何做到这一点吗?

【问题讨论】:

  • 你能分享你对这个问题的解决方案吗?我对我的项目有完全相同的要求。

标签: serilog


【解决方案1】:

Serilog 允许您为每个程序使用一个记录器配置;虽然可以逐类调整日志记录,但这通常是在事后通过过滤等来完成的。

推荐的方法是:

将 Serilog 设置为 Program.Main() 或您应用的入口点所在的任何位置的第一件事:

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

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

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,代码中的配置通常会更轻松(更少的移动部分)。

【讨论】:

  • 我正在尝试按照您的描述进行操作。 Serilog 设置在主核心项目上完成。然后,还将对 Serilog 包的引用添加到 Web API 项目中,在控制器中,我添加了对 Log 对象 (Log.Information("This is a message");) 的直接引用,以在配置的接收器(控制台和 SQLServer)上写入。当我在核心类中运行时,一切正常,而在控制器中我没有错误,但也没有日志。
【解决方案2】:

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

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

然后我在从组件中安装了 Serilog,并向主组件公开了一个订阅功能,如下所示:

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

如有必要,我会从主程序集调用它

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多