web-dev-qa-db-fra.com

log4net ne fonctionne que lorsque XmlConfigurator.Configure () est appelé

Je comprends que ceciquestionaétédemandéplusieurs = fois , mais malheureusement, je n'ai pas réussi à faire fonctionner ma configuration de journalisation. Je dois faire quelque petite erreur quelque part.

J'ai une application Web .NET 4.5 MVC 4/EF 5 et j'essaie de faire fonctionner la journalisation. La solution a deux projets, un pour les objets DAO et modèle et un pour le site Web. Le fichier App.Config ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="RebuildingTogetherEntities" connectionString="stuff..."/>
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
  <log4net configSource="Log.config" />
</configuration>

La même section log4net a également été copiée dans le fichier Web.Config.

J'ai ajouté ce qui suit aux deux fichiers AssemblyInfo.cs:

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log.config", Watch = true)]

"Copy To Output Directory" est défini sur true pour les deux fichiers Log.Config.

La seule façon dont je peux sembler obtenir la journalisation à ajouter au fichier de sortie est d'appeler XmlConfigurator.Configure () avant l'exécution de la première instruction de journalisation. Je suppose que je peux écrire une façade pour le faire lorsque j'obtiens l'enregistreur pour la première fois, mais cela me semble tout simplement faux.

Comment puis-je initialiser l'enregistreur sans appeler manuellement le XmlConfigurator?

20
Brad

J'ai fait face exactement au même problème. Comme vous le faites remarquer à juste titre, vous ne devriez pas avoir besoin d'appeler explicitement XmlConfigurator lorsque vous incluez la ligne dans votre AssemblyInfo.cs. Le problème survient lorsque la première utilisation de log4net est dans un ensemble qui n'a pas cette ligne. Dans mon cas, j'utilisais le package Topshelf.Log4Net NuGet, et la première ligne de journal que mon application a enregistrée était par le biais de cela.

Vous pouvez simplement enregistrer une ligne au début de votre application ou si vous n'avez pas besoin de vous connecter, faites ce que j'ai fait et ajoutez ce qui suit au point d'entrée de l'application

LogManager.GetLogger(typeof(Program));
27
Matt Cole

Vous n'avez pas besoin d'appeler le XmlConfigurator manuellement si vous utilisez:

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log.config", Watch = true)]

Cependant, vous devez ajouter la balise à toutes vos DLL (tous les fichiers assambly.cs).

9
Peter