我开始了一个新的Windows服务项目,并决定使用.NET Core 3.0 Worker Service模板。这项服务永远不会在云/ Web项目中使用,但是有可能我可能想使其适应于在Linux上运行。
我对使用NLog进行日志记录非常熟悉。在每个类中创建新的静态记录器对象的模型非常直观。我看到工作器服务已引入Microsoft.Extensions.Logging
框架,以至于默认工作器已直接传入了ILogger<Worker>
。这对于“我的第一项服务”非常有用,但是真正的长期运行的服务很多类,每个类都需要记录?
我为此模板找到的所有教程都涉及服务,这些服务完成所有工作并登录到Worker类。由于历史原因,大多数日志记录文章仅考虑以DI为优先的ASP.NET core。我还没有找到有关如何使用具有多个长期存在的类的树来构建应用程序的任何描述,每个类都有自己的ILogger
对象可写入。
尽管我在这个项目中永远不需要DI,但似乎在我的代码库中采用它可能是一个很好的标准,起初将其连接到NLog提供程序。我可以在IHostBuilder
中抓取Main
,然后添加一个静态函数以类似于NLog的方式从其ILoggingBuilder
创建记录器,但我不认为这是最好的方法。
这里是否有既定的最佳实践?它是否涉及从Worker Service模板中挑选一些魔术?
NLog可以在.Net Core中正常运行,而无需依赖注入的任何帮助。您只是喜欢一如既往:
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
private static void Main()
{
Logger.Info("Hello World");
}
但是NLog也可以使用Microsoft Dependency Injection与Microsoft Extension Logging(MEL)集成。您只需注册NLog LoggingProvider,然后MEL-ILogger输入将转发到NLog。
在IHostBuilder.ConfigureLogging
中,可以调用AddNLog()
(就像对于内置MEL-LoggingProviders可以调用AddDebug()
或AddConsole()
一样]
您可以在Wiki页面上找到一个简单的示例(如果需要,还可以链接到ASP.NET Core:]]
https://github.com/NLog/NLog/wiki/Getting-started-with-.NET-Core-2---Console-application
某些人不喜欢即使对于简单的类(过于混乱)也必须通过类构造器注入MEL-ILogger。相反,他们只是直接使用NLog.LogManager.GetCurrentClassLogger()
。
也许值得一看Serilog
https://serilog.net/?Serilog非常灵活,您可以添加各种类型的接收器,例如:控制台,文件,elasticsearch,seq等。而且您不必到处乱写它。