J'utilise la classe HostBuilder .NET Core 2.1 pour configurer et exécuter un serveur GRPC et j'ai du mal à configurer correctement SeriLog afin qu'il soit utilisé par le pipeline de journalisation .NET Core et disponible (via l'injection de dépendances) ailleurs dans mon application.
class Program
{
private static async Task Main(string[] args)
{
var hostBuilder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<ILogger>(BuildLogger);
// other services here
})
.ConfigureLogging((hostContext, loggingBuilder) =>
loggingBuilder.AddSerilog(dispose: true));
await hostBuilder.RunConsoleAsync();
}
private static ILogger BuildLogger(IServiceProvider provider)
{
// create a (global) logger
Log.Logger = new LoggerConfiguration()
...
.CreateLogger();
return Log.Logger;
}
}
Le problème est que j'ai besoin de l'appel à loggingBuilder.AddSerilog()
pour utiliser le singleton ILogger
qui a été enregistré avec la configuration des services DI quelques lignes ci-dessus.
Je me rends compte que je pourrais appeler directement BuildLogger()
pour obtenir l'instance ILogger
et enregistrer cette instance avec la configuration du service DI, mais il semble que je ne devrais pas avoir à le faire. Ce que je recherche, c'est un moyen, à partir de la méthode .ConfigureLogging()
, d'accéder à une instance ServiceProvider
pour que je puisse obtenir le ILogger
enregistré, peut-être comme
serviceProvider.GetRequiredService<ILogger>();
et transmettez-le à l'appel AddSerilog()
. Des idées?
Ce que je recherche, c'est un moyen, à partir de la méthode .ConfigureLogging (), d'accéder à une instance de ServiceProvider pour pouvoir obtenir l'ILogger enregistré
Vous pouvez accéder à ServiceProvider
à partir de la méthode ConfigureLogging()
via ILoggingBuilder.Services.BuildServiceProvider()
. Ainsi:
//...
private static async Task Main(string[] args)
{
var hostBuilder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<ILogger>(BuildLogger);
// other services here
})
.ConfigureLogging((hostContext, loggingBuilder) =>
loggingBuilder.AddSerilog(
loggingBuilder
.Services.BuildServiceProvider().GetRequiredService<ILogger>(),
dispose: true));
await hostBuilder.RunConsoleAsync();
}
...//
Essayez le nouveau package maintenant disponible dans Serilog - https://github.com/serilog/serilog-extensions-hosting .
public static IHost BuildHost(string[] args) =>
new HostBuilder()
.ConfigureServices(services => services.AddSingleton<IHostedService, PrintTimeService>())
.UseSerilog() // <- Add this line
.Build();
Selon la documentation du référentiel pour .NET Core 2.0+, appelez AddSerilog()
sur le loggingBuilder
fourni et assurez-vous de configurer Serilog en premier:
//...
private static async Task Main(string[] args) {
Log.Logger = new LoggerConfiguration()
//...
.CreateLogger();
var hostBuilder = new HostBuilder()
.ConfigureServices((hostContext, services) => {
services.AddLogging(loggingBuilder =>
loggingBuilder.AddSerilog(dispose: true));
// other services here
});
await hostBuilder.RunConsoleAsync();
}
//...