【问题标题】:Adding Serilog ILogger to a static class将 Serilog ILogger 添加到静态类
【发布时间】:2018-11-07 14:18:03
【问题描述】:

我想像这样将 Serilog Log 添加到我的程序中的静态类中(DataHelper 是类名):

private readonly ILogger _log = Log.ForContext<DataHelper>();

但这会导致错误信息:

静态类型不能用作类型参数

这是有道理的。那么如何将记录器(在非静态类中运行良好)注入这个类?

更新:您提到的问题的答案表明这是不可能的。但根据 Serilog 的 Github,there is a workaround。我只需要 log 就可以知道它正在记录的类。目前,它似乎是从主类记录。

【问题讨论】:

  • @nilsK 您提到的问题的答案表明这是不可能的。但是根据Serilog的Github,有一个办法:github.com/serilog/serilog/issues/886
  • 我会做什么,如果你有可能的话,重构 DataHelper 类并将常规对象注册为单例。它将简化使用和可测试性
  • @OlegI 这是否意味着我创建的每个静态类,为了写入日志,都需要变成单例?
  • @Disasterkid 好吧,如果没有简单的解决方法来解决您的问题并且编写日志对您至关重要,那么您可以做出这样的决定

标签: c# logging .net-core serilog


【解决方案1】:

你需要使用接受Type的重载:

private readonly ILogger _log = Log.ForContext(typeof(DataHelper));

【讨论】:

  • private之后我们不需要static吗?
  • 取决于使用情况;我在这里只做了最小的更改,以在上面的代码示例设置中显示ForContext() 重载。如果_log 字段在静态类中,则肯定需要添加static;否则,在这种情况下,这可能是一个品味问题。 HTH!
【解决方案2】:

this issue 上的讨论讨论了此限制并提出了解决方案。总结:使用重载ForContext(Type),可以使用typeof(DataHelper)传递静态类的类型。

【讨论】:

  • 这似乎可行,但"SourceContext" 的值应该是多少?它记录就像我们从 Main 类记录一样。
  • 打败我;我从未使用过 Serilog。
猜你喜欢
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
相关资源
最近更新 更多