2017-06-30 30 views
7

我創建了一個消費者/作業,我將在Linux上用C#編寫一個進程。接線並將NLog注入到.Net Core控制檯應用程序

過程將:

  1. 從RabbitMQ的上n日誌有關.NET核心閱讀郵件
  2. 進行更改數據庫
  3. 記錄任何錯誤

所有的文件都在aspnet核心。當我嘗試獲得​​實現時,它將返回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<ILoggerFactory>(); 
     loggerFactory.AddNLog(); 
} 

static void Main(string[] args) 
{ 
    ConfigureServices(); 

    var logger = ServiceProvider.GetService<NLog.ILogger>(); 

    logger.Debug("Logging"); 

    [...] 
} 

不要與環境變量ASPNETCORE_ENVIRONMENT混淆;它僅用於確定使用哪個appsettings.json

我已經根據我的代碼issue report

最後,這些是我目前安裝的軟件包。在.NET核心控制檯應用程序NLOG用法

<ItemGroup> 
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="1.1.2" /> 
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="1.1.2" /> 
    <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="1.1.2" /> 
    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="1.1.2" /> 
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="1.1.2" /> 
    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="1.1.2" /> 
    <PackageReference Include="NLog" Version="5.0.0-beta09" /> 
    <PackageReference Include="NLog.Extensions.Logging" Version="1.0.0-rtm-beta5" /> 
    <PackageReference Include="Npgsql" Version="3.2.4.1" /> 
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="1.1.0" /> 
    </ItemGroup> 
+0

解決'Microsoft.Extensions。Logging.ILogger'而不是'NLog.ILogger'。 –

+0

@IlyaChumakov不會只是給我的MSFT記錄器和路由我所有的日誌通過MSFT日誌? –

+0

其實,我剛剛測試過這個,'logger'仍然是空的。 –

回答

13

完整簡約例子(基於NLog.Extensions.Logging庫):

var services = new ServiceCollection(); 
services.AddLogging(); 
var provider = services.BuildServiceProvider(); 

var factory = provider.GetService<ILoggerFactory>(); 
factory.AddNLog(); 
factory.ConfigureNLog("nlog.config"); 

var logger = provider.GetService<ILogger<Program>>(); 
logger.LogCritical("hello nlog"); 

參考文獻:

<ItemGroup> 
     <PackageReference Include="NLog.Extensions.Logging" Version="1.0.0-rtm-beta5" /> 
     <PackageReference Include="Microsoft.Extensions.Configuration" Version="1.1.2" /> 
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="1.1.1" /> 
     <PackageReference Include="Microsoft.Extensions.Logging" Version="1.1.2" /> 
    </ItemGroup> 

nlog.config:

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     internalLogFile="internal-nlog.txt"> 

    <variable name="Layout" 
      value="${longdate}|${level:uppercase=true}|${logger}|${message}"/> 

    <!-- the targets to write to --> 
    <targets> 
    <!-- write logs to file --> 
    <target xsi:type="File" 
      name="allfile" 
      fileName="nlog-all-${shortdate}.log" 
      layout="${Layout}" /> 

    <!-- write to the void aka just remove --> 
    <target xsi:type="Null" name="blackhole" /> 
    </targets> 

    <!-- rules to map from logger name to target --> 
    <rules> 
    <!--All logs, including from Microsoft--> 
    <logger name="*" minlevel="Trace" writeTo="allfile" /> 

    <!--Skip Microsoft logs and so log only own logs--> 
    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /> 
    </rules> 
</nlog> 
-4

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

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

通過使用Microsoft.Extensions.Logging,您可以獲得支持結構化日誌記錄等內容。並且能夠執行動態過濾並用您最喜歡的選擇替換日誌記錄接收器/目標。如果你只是想控制檯日誌記錄,那麼不需要選擇任何日誌框架。 –

0

在DotNet Core 2中,您現在可以使用啓動類並清理代碼,看起來更像Web。

作爲獎勵的方式使用啓動DI容器內你的應用程序ConsoleApp

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<ConsoleApp>().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<IConfigurationRoot>(Configuration); 

     services.AddSingleton<IMyConfiguration, MyConfiguration>(); 

     services.AddSingleton(new LoggerFactory() 
       .AddNLog() 
       .ConfigureNLog("nlog.config") 
       ); 

     services.AddLogging(); 

     services.AddTransient<ConsoleApp>(); 
    } 

} 

ConsoleApp.cs

public class ConsoleApp 
{ 
    private readonly ILogger<ConsoleApp> _logger; 
    private readonly IMyConfiguration _config; 

    public ConsoleApp(IMyConfiguration configurationRoot, ILogger<ConsoleApp> 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; } 
} 
相關問題