Может быть, стоит взглянуть на Serilog
https://serilog.net/? Serilog очень гибок, и вы можете добавить различные варианты приемников, например: console, file ,asticsearch, seq, другие ... И вы неЯ должен DI повсюду.
Вот так я использую его для печати на консоль (std :: out).
using System;
using System.IO;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Serilog;
namespace YourNamespace
{
public class Program
{
private static readonly string _applicationName = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
public static IConfiguration Configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", reloadOnChange: true, optional: true)
.AddEnvironmentVariables()
.Build();
public static int Main(string[] args)
{
// serilog
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.Enrich.FromLogContext()
.CreateLogger();
try
{
if (string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")))
throw new Exception("Hosting environment variable not set");
Log.Information($"Bootstrapping application: {_applicationName}");
CreateWebHostBuilder(args).Build().Run();
Log.Information($"Gracefully closing application: {_applicationName}");
return 0; // returning a zero, indicates a successful shutdown.
}
catch (Exception e)
{
Log.Information($"Host {_applicationName} - terminated unexpectedly.", e);
return 1; // returning a none-zero, indicates failure.
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseConfiguration(Configuration)
.UseSerilog(); // overrides default logger
}
}
И теперь вы можете использовать его где угодноВы хотите, чтобы в вашей программе, например, контроллер
try
{
Log.Information("Testing the logs..");
}
catch (Exception e)
{
Log.Error("{@e}", e); // stack trace or other objects where {@e} is the object template.
return BadRequest($"Rule violation: {e.Message}");
}
и соответствующей конфигурации (только запись в консоль):
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": { // overrides default logger from MS
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {SourceContext}>{NewLine}{Exception}"
}
}
]
}
И нюгеты:
<PackageReference Include="Serilog" Version="2.9.0" />
<PackageReference Include="Serilog.AspNetCore" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
Если вы хотите использовать DI-регистраторы, может, стоит взглянуть на фреймворк Autofac DI? Надеюсь, это поможет.