将NLog连接并注入.Net Core控制台应用程序

我创建了一个消费者/工作,我将作为一个用C#编写的Linux进程运行。

该过程将:

  1. 阅读RabbitMQ的消息
  2. 对数据库进行更改
  3. 记录任何错误

关于.net核心的nlog上的所有文档都在aspnet核心上。 当我尝试获得ILogger实现时,它返回null。

这是除了接线和使用之外:

 static void ConfigureServices() { string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); var builder = new ConfigurationBuilder() .SetBasePath(Path.Combine(AppContext.BaseDirectory)) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{environment}.json", optional: true); var services = new ServiceCollection(); Configuration = builder.Build(); [...] services.AddLogging(); ServiceProvider = services.BuildServiceProvider(); var loggerFactory = ServiceProvider.GetService(); loggerFactory.AddNLog(); } static void Main(string[] args) { ConfigureServices(); var logger = ServiceProvider.GetService(); logger.Debug("Logging"); [...] } 

不要与环境变量ASPNETCORE_ENVIRONMENT混淆; 它仅用于确定要使用的appsettings.json

我的代码基于此问题报告 。

最后,这些是我目前安装的软件包。

             

.NET Core控制台应用程序中基于NLog.Extensions.Logging存储库的NLog的完整简约示例:

 var services = new ServiceCollection(); services.AddLogging(); var provider = services.BuildServiceProvider(); var factory = provider.GetService(); factory.AddNLog(); factory.ConfigureNLog("nlog.config"); var logger = provider.GetService>(); logger.LogCritical("hello nlog"); 

参考文献:

        

nlog.config:

                   

在DotNet Core 2中,您现在可以使用启动类并稍微清理代码,使其看起来更像Web。

并且使用ConsoleApp作为奖励一种在DI容器内启动应用程序的方法

Program.cs中

 static void Main(string[] args) { IServiceCollection services = new ServiceCollection(); Startup startup = new Startup(); startup.ConfigureServices(services); IServiceProvider serviceProvider = services.BuildServiceProvider(); // entry to run app serviceProvider.GetService().Run(); } 

Startup.cs

 public class Startup { IConfigurationRoot Configuration { get; } public Startup() { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); Configuration = builder.Build(); } public void ConfigureServices(IServiceCollection services) { services.AddSingleton(Configuration); services.AddSingleton(); services.AddSingleton(new LoggerFactory() .AddNLog() .ConfigureNLog("nlog.config") ); services.AddLogging(); services.AddTransient(); } } 

ConsoleApp.cs

 public class ConsoleApp { private readonly ILogger _logger; private readonly IMyConfiguration _config; public ConsoleApp(IMyConfiguration configurationRoot, ILogger logger) { _logger = logger; _config = configurationRoot; } public void Run() { var test = _config.YourItem; _logger.LogCritical(test); System.Console.ReadKey(); } } 

Configuration.cs

 public class MyConfiguration : IMyConfiguration { IConfigurationRoot _configurationRoot; public MyConfiguration(IConfigurationRoot configurationRoot) { _configurationRoot = configurationRoot; } public string YourItem => _configurationRoot["YourItem"]; } public interface IMyConfiguration { string YourItem { get; } } 

我的解决方案是使用一个使用Console.Writeline的适配器模式,直到更加理智的NLog版本可用。

 using System; public static class Log { public static void Write(string message) { Console.WriteLine($"{DateTime.Now}: {message}"); } }