也许值得看看Seriloghttps://serilog.net/?
Serilog 非常灵活,您可以添加各种接收器,例如:控制台、文件、elasticsearch、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}"
}
}
]
}
还有 nugets:
<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 框架?
希望对您有所帮助。