C#で記述されたLinuxでプロセスとして実行するコンシューマー/ジョブを作成しました。
プロセスは次のようになります。
.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<ILoggerFactory>();
loggerFactory.AddNLog();
}
static void Main(string[] args)
{
ConfigureServices();
var logger = ServiceProvider.GetService<NLog.ILogger>();
logger.Debug("Logging");
[...]
}
環境変数ASPNETCORE_ENVIRONMENT
と混同しないでください。使用するappsettings.json
を決定するためだけに使用されます。
これに基づいてコードを作成しました issue report 。
最後に、これらは現在インストールしているパッケージです。
<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>
.NET Core 1コンソールアプリでのNLogの完全な最小限の例( 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>
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<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.AddLogging(loggingBuilder => {
loggingBuilder.AddNLog("nlog.config");
});
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; }
}