La configuration Log4Net dans un fichier externe ne fonctionne pas

91

Nous utilisons log4net et souhaitons spécifier sa configuration dans un fichier de configuration externe (comme nous l'avons fait avec d'autres sections). Pour ce faire, nous avons changé la section log4net dans App.config en:

...
<section name="log4net" 
     type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...

Et dans le fichier Log.Config (même répertoire que App.config), nous avons:

<log4net>
  <appender name="General" type="log4net.Appender.FileAppender">
    <file value="myapp.log" />
    <layout type="log4net.Layout.SimpleLayout" />
  </appender>
  <root>
    <appender-ref ref="General" />
  </root>
</log4net>

Cependant, lorsque nous exécutons l'application, aucun fichier journal n'est créé (et aucune journalisation n'est effectuée). Il n'y a aucun message d'erreur émis vers la console.

Si nous remettons le contenu du fichier Log.config dans App.config (en remplaçant la première ligne de code ci-dessus), cela fonctionne comme prévu. Une idée pourquoi cela ne fonctionne pas dans un fichier externe?

Robert Wagner
la source
J'ai rencontré le même problème - nous avons probablement suivi le même guide (mal guidé)!
Zach Burlingame
14
C'est ce que je n'aime pas chez log4net. Le cadre de journalisation devrait être l'un des éléments les plus solides de votre application à mon avis - mais log4net semble souvent un peu floconneux.
UpTheCreek

Réponses:

113

Avez-vous l'attribut suivant dans votre AssemblyInfo.csfichier:

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

et un code comme celui-ci au début de chaque classe qui nécessite une fonctionnalité de journalisation:

private static readonly ILog log = 
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

J'ai un article de blog contenant ceci et d'autres informations ici .

Blé Mitch
la source
17
Cela fonctionne, assurez-vous que vous créez le fichier log4net.config pour définir la propriété «Copier dans le répertoire de sortie» sur «Copier toujours».
E. van der Spoel
@mitchwheat Absolument, je me suis battu avec une solution basée sur des ninjects pour faire exactement ce que cela fait toute la journée ... merci mec!
Guerre du
39

Il y a un défaut ouvert sur ce problème. Log4Net ne prend pas en charge l'attribut configSource des éléments de configuration. Pour utiliser une solution de fichier de configuration purement, vous utilisez la clé log4net.Config dans appSettings.

Étape 1: Incluez la définition de la section de configuration normale:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>

Étape 2: Utilisez la clé magique log4net.Config dans appSettings.

<appSettings>
      <add key="log4net.Config" value="log4net.simple.config" />
</appSettings>

Étape 3: Contribuez à un correctif pour corriger la gestion de configSource.

Abrupt
la source
5
Un appel à log4net.Config.XmlConfigurator.Configure (); devrait surmonter ce problème en ne lisant pas configSource
Greg Domjan
Cela n'a rien changé pour moi. Je n'ai pas encore résolu le problème, mais je vais essayer de faire un suivi.
Don Rolling
5
Il est important de marquer le fichier de configuration log4net comme "copie si plus récent". Si le fichier de configuration n'est pas copié dans le dossier bin, cela ne fonctionnera pas.
Francisco Goldenstein
Cela a fonctionné pour moi tel quel, et je la préfère à la solution acceptée car certaines de mes bibliothèques sont utilisées dans une application Web où la journalisation est configurée dans un log4net.config distinct et parfois utilisée dans une application autonome où la journalisation est configuré dans app.exe.config. De cette façon, tout est dans la configuration plutôt que dans les informations d'assemblage - je ne veux pas le "coder en dur" dans log4net.config
Danny
27

L'étape qui a été manquée est

log4net.Config.XmlConfigurator.Configure(); 

cela entraînera l'utilisation du configSource. Assurez-vous de l'appeler une fois avant d'appeler GetLogger ();

Greg Domjan
la source
Vous n'avez pas besoin de le faire si vous utilisez la solution de Mitch Wheat.
Robert Wagner
4
@Robert: Bien sûr, bien que la solution de Mitch Wheat nécessite un codage en dur du fichier de configuration en dehors de app.config - j'ai lu la question d'origine était de savoir pourquoi configSource ne fonctionne pas, cela fonctionne si cette étape supplémentaire est suivie.
Greg Domjan
J'aime davantage cette approche, en particulier parce que je crée un gestionnaire de journaux wrapper qui utilise en interne log4net (qui pourrait être remplacé plus tard), puis dans ce gestionnaire de journaux wrapper, j'appelle toujours log4net.Config.XmlConfigurator.Configure (). De cette façon, tout projet avec son propre app.config pourrait utiliser ce gestionnaire de journal wrapper, sans avoir besoin de changer assembler.cs
zheng yu
19

Assurez-vous que votre fichier log4net.config est défini avec les propriétés suivantes:

Action de création: contenu

Copier dans le répertoire de sortie: Copier toujours

Lewis Moten
la source
10

Soit utiliser,

<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4Net.config" />
</appSettings>

ou juste,

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));

Dans les deux cas, le fichier, Log4Net.config, devrait être là dans le répertoire de sortie. Vous pouvez le faire en définissant les propriétés du fichier Log4Net.config dans l'explorateur de solutions. Action de construction - Contenu et copie dans le répertoire de sortie - Copie toujours

Byju
la source
vous n'avez pas besoin de la balise <configSections> pour le premier cas
disklosr
2

Attention à ce problème ...

Dans mon cas, tout a été configuré correctement. Le problème est que j'ai utilisé Web Deploy dans Visual Studio 2013 pour télécharger le site sur WinHost.com et il a réinitialisé les ACL sur le serveur. Cela a à son tour révoqué toutes les autorisations sur les dossiers et les fichiers - log4net n'a pas pu écrire le fichier.

Vous pouvez en savoir plus ici:

Comment empêcher Web Deploy / MSBuild de perturber les autorisations du serveur

J'ai demandé à l'équipe d'assistance de réinitialiser les ACL, puis log4net a commencé à cracher des journaux. :)

Leniel Maccaferri
la source
1

En supposant que vous disposiez d'un fichier de configuration externe appelé log4net.config qui est copié dans votre répertoire de déploiement, vous pouvez le configurer comme suit:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Reflection;

using log4net;

namespace MyAppNamespace {
    static class Program {
        //declare it as static and public so all classes in the project can access it
        //like so: Program.log.Error("got an error");
        public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() {
             //configure it to use external file
            log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config"));
            //use it
            log.Debug("#############   STARING APPLICATION    #################");


            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormMain());
        }
    }
}
JJ_Coder4Hire
la source
1

J'ai eu le même problème, en plus d'avoir

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]

dans le projet en cours, j'avais également la ligne suivante dans un projet de référence:

[assembly: log4net.Config.XmlConfigurator]

Lorsque j'ai supprimé cette ligne dans les projets référencés, les journaux commencent à apparaître.

L'invité
la source
1

Il est également possible d'activer un mode de débogage pour log4net. Insérez-le dans le fichier App.config:

 <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
 </appSettings>
 <system.diagnostics>
      <trace autoflush="true">
      <listeners>
           <add
             name="textWriterTraceListener"
             type="System.Diagnostics.TextWriterTraceListener"
             initializeData="link\to\your\file.log" />
      </listeners>
      </trace>
 </system.diagnostics>

et vous obtiendrez au moins des messages d'erreur, à partir desquels vous pourrez déduire ce qui n'a pas fonctionné. Dans mon cas , je simplement oublié de mettre Copy to output directoryà Copy Always.

waka
la source
0

@Mitch, il s'avère qu'il y a un fichier avec la déclaration [assembly: ...], mais il n'a pas la propriété ConfigFile.

Une fois que je l'ai ajouté et l'ai pointé vers Log.config, cela a commencé à fonctionner. J'aurais pensé que cela fonctionnerait comme toutes les autres sections de configuration (c'est-à-dire AppSettings) et accepterait les fichiers de configuration externes sans modification.

Nous n'avons pas la deuxième déclaration que vous avez mentionnée, car nous l'enveloppons dans un fournisseur de journal statique global.

Robert Wagner
la source
0

Dans mon cas, j'ai reçu ce message d'erreur:

log4net: config file [C:\........\bin\Debug\log4net.config] not found.

Et log4net.configle fichier se trouvait dans le projet Visual Studio 2017, mais lorsque j'ai vérifié le fichier dans le bin\Debugdossier, je ne l'ai pas trouvé.

Ma configuration d'assemblage d'origine était comme ceci:

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

Après un certain temps de recherche, je le change comme suit et cela fonctionne:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"..\..\log4net.config", Watch = true)]
maytham-ɯɐɥʇʎɐɯ
la source
0
  1. ajouter ce qui suit à AssemblyInfo.cs

[assembly: log4net.Config.XmlConfigurator (ConfigFile = "Log4Net.config")]

  1. Assurez-vous que log4net.config est inclus dans le projet
  2. Dans les propriétés de log4net.config

changer Copier dans le répertoire de sortie en Copier si plus récent

  1. Vérifiez la valeur du niveau de niveau de journal = "TOUS"
e03050
la source
0

Il convient également de souligner que dans une application Web, il se trouve dans le répertoire racine, pas dans le dossier bin, alors assurez-vous que c'est là que vous placez le fichier de configuration.

Richard
la source