【发布时间】:2020-06-29 21:07:19
【问题描述】:
在这个应用程序中,我已经拉入并设置了适用于异常的 Serilog,并且我想将 Microsoft 的 Logger 与 Serilog 一起使用,但我似乎无法弄清楚如何在没有此错误的情况下将其 DI 到服务中dotnet build.
我不确定 ILogger 使用 Serilog 实例缺少什么?
dotnet build 出错:
[13:56:21 FTL] Host terminated unexpectedly
System.AggregateException: Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activate 'App.Services.MyService'.)
依赖注入到服务中:
using Microsoft.Extensions.Logging;
public class MyService : BaseService
{
private readonly ILogger _logger;
public MyService(
ILogger logger)
: base(context, httpContext)
{
_logger = logger;
}
// ... Removed for brevity
}
实施
public static int Main(string[] args)
{
CreateLogger();
try
{
Log.Information("Starting web host");
CreateHostBuilder(args)
.Build()
.Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
// Ensure buffered logs are written to their target sink
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>())
.UseSerilog();
private static void CreateLogger()
{
string path = PrimeConstants.LOG_FILE_PATH;
try
{
if (isDevelopment())
{
Directory.CreateDirectory(path);
}
}
catch (Exception e)
{
Console.WriteLine("Creating the logging directory failed: {0}", e.ToString());
}
var name = Assembly.GetExecutingAssembly().GetName();
var outputTemplate = "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}";
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information)
.MinimumLevel.Override("System", LogEventLevel.Warning)
.Enrich.FromLogContext()
.Enrich.WithMachineName()
.Enrich.WithProperty("Assembly", $"{name.Name}")
.Enrich.WithProperty("Version", $"{name.Version}")
.WriteTo.Console(
outputTemplate: outputTemplate,
theme: AnsiConsoleTheme.Code)
.WriteTo.Async(a => a.File(
$@"{path}/prime.log",
outputTemplate: outputTemplate,
rollingInterval: RollingInterval.Day,
shared: true))
.WriteTo.Async(a => a.File(
new JsonFormatter(),
$@"{path}/prime.json",
rollingInterval: RollingInterval.Day))
.CreateLogger();
}
【问题讨论】:
标签: c# asp.net-core .net-core serilog