.Net Core 3.1
Malheureusement, pour ASP.NET Core 3.0, la situation est encore un peu différente. Les modèles par défaut utilisent le HostBuilder
(au lieu du WebHostBuilder
) qui configure un nouvel hôte générique pouvant héberger plusieurs applications différentes, sans se limiter aux applications Web. Une partie de ce nouvel hôte est également la suppression du deuxième conteneur d'injection de dépendances qui existait auparavant pour l'hôte Web. Cela signifie finalement que vous ne pourrez pas injecter de dépendances en dehors de IConfiguration
dans la Startup
classe. Vous ne pourrez donc pas vous connecter pendant la ConfigureServices
méthode. Vous pouvez cependant injecter le logger dans la Configure
méthode et vous y connecter:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILogger<Startup> logger)
{
logger.LogInformation("Configure called");
// …
}
Si vous devez absolument vous connecter ConfigureServices
, vous pouvez continuer à utiliser le WebHostBuilder
qui créera l'héritage WebHost
qui peut injecter le logger dans la Startup
classe. Notez qu'il est probable que l'hôte Web sera supprimé à un moment donné dans le futur. Vous devriez donc essayer de trouver une solution qui fonctionne pour vous sans avoir à vous connecter ConfigureServices
.
.NET Core 2.x
Cela a considérablement changé avec la publication d'ASP.NET Core 2.0. Dans ASP.NET Core 2.x, la journalisation est créée au niveau du générateur d'hôte. Cela signifie que la journalisation est disponible via DI par défaut et peut être injectée dans la Startup
classe:
public class Startup
{
private readonly ILogger<Startup> _logger;
public IConfiguration Configuration { get; }
public Startup(ILogger<Startup> logger, IConfiguration configuration)
{
_logger = logger;
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
_logger.LogInformation("ConfigureServices called");
// …
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
_logger.LogInformation("Configure called");
// …
}
}
ConfigureServices
s'exécute, l'enregistreur n'existe pas encore. Vous ne pourrez donc pas vous connecter à ce stade simplement parce qu'il n'y a pas encore d'enregistreur. Du côté positif, cela vous donne toujours la possibilité de configurer l'enregistreur dans leConfigureServices
car il s'agit du même conteneur DI (ce qui est en fait une bonne chose). - Si vous avez absolument besoin de consigner des données, vous pouvez par exemple collecter les informations séparément (par exemple dans une liste), puis vous déconnecter dès que l'enregistreur est disponible..NET 3.1
vous pouvez actuellement vous connecter au sein de laConfigureServices
méthode sans retomber sur leWebHostBuilder
. Utilisez la réponse ci-dessous: stackoverflow.com/a/61488490/2877982Startup.cs
(donc j'obtiens des erreurs de compilateur en oubliant une dépendance) au lieu d' enregistrer uniquement des dépendances personnalisées. Par conséquent, je dois résoudre ces enregistreurs. Mais cela pourrait être un peu piraté, oui.Option 1: utiliser directement le journal (par exemple Serilog) au démarrage-
Production:
Pour configurer Serilog dans l'application asp.net-core, consultez le package Serilog.AspNetCore sur GitHub .
Option2: Configurez la journalisation dans program.cs comme ceci-
User loggerFactory au démarrage comme ceci-
Détails complets disponibles sur ce lien
la source
J'utilise une solution évitant les enregistreurs tiers implémentant un «tampon enregistreur» avec l' interface ILogger .
L'utilisation dans startup.cs est facile, bien sûr, vous obtenez une sortie de journal après l'appel de Configure. Mais mieux que rien. :
la source
Pour .NET Core 3.0, la documentation officielle indique ceci: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.0#create-logs-in-startup
Mais comme on dit dans la documentation, vous pouvez configurer un service qui dépend d'ILogger, donc si vous avez écrit une classe StartupLogger:
Ensuite, dans Startup.ConfigureServices, ajoutez le service, puis vous devez créer le fournisseur de services pour accéder au conteneur DI:
Edit: cela produit un avertissement du compilateur, dans le but de déboguer votre classe StartUp cela devrait être OK mais pas pour la production:
la source
Selon .net core 3.1 , vous pouvez créer un enregistreur directement à l'aide de LogFactory.
la source
La solution officielle consiste actuellement à configurer une LoggerFactory locale comme celle-ci:
Voir aussi: https://github.com/dotnet/aspnetcore/issues/9337#issuecomment-539859667
la source
Code principal:
CreateDefaultBuilder configure un enregistreur de console par défaut.
Code de démarrage:
Je n'ai pas pu faire fonctionner l'injection d'un ILogger, mais c'est peut-être parce que ce n'est pas un contrôleur. Plus d'informations bienvenue!
Réf:
la source
Aucune des réponses ci-dessus n'a fonctionné pour moi. J'utilise NLog et je construis même un nouveau ServiceCollection, en appelant .CreateBuilder () sur n'importe quelle collection de services, en créant un service de journalisation ... rien de tout cela n'écrirait dans un fichier journal pendant ConfigureServices.
Le problème est que la journalisation n'est vraiment une chose qu'après la génération de ServiceCollection, et elle n'est pas générée pendant ConfigureServices.
Fondamentalement, je veux juste (besoin) d'enregistrer ce qui se passe au démarrage dans une méthode d'extension de configuration, car le seul niveau sur lequel j'ai un problème est PROD, où je ne peux pas attacher un débogueur.
La solution qui a fonctionné pour moi utilisait l'ancienne méthode NLog .NET Framework:
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
ajouté ce droit à la classe de méthode d'extension, et j'ai pu écrire dans un journal ("le" journal) pendant ConfigureServices et après.Je n'ai aucune idée si c'est une bonne idée de publier dans le code de production (je ne sais pas si l'ILogger contrôlé par .NET et ce NLog.ILogger seront en conflit à tout moment), mais j'en avais besoin seulement pour voir ce qui se passait sur.
la source
J'ai réussi à le faire en créant statiquement un enregistreur avec Nlog dans le fichier, puis en l'utilisant dans les méthodes de démarrage.
la source
System.IO.File.Write()
méthodes.Utilisez simplement la ligne ci-dessous pour vous connecter à Startup.cs
la source