web-dev-qa-db-fra.com

Log4Net config dans un fichier externe ne fonctionne pas

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 modifié la section log4net du fichier 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). Aucun message d'erreur n'est envoyé à la console.

Si nous déplaçons le contenu du fichier Log.config dans le fichier App.config (en remplaçant la première ligne de code ci-dessus), cela fonctionne normalement. Toute idée pourquoi cela ne fonctionne pas dans un fichier externe?

83
Robert Wagner

Avez-vous l'attribut suivant dans votre fichier AssemblyInfo.cs

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

et 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 infos ici .

106
Mitch Wheat

Il y a un défaut ouvert sur cette question. Log4Net ne prend pas en charge l'attribut configSource des éléments de configuration. Pour utiliser uniquement une solution de fichier de configuration, 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 résoudre le problème de la gestion de configSource. 

36
Precipitous

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

log4net.Config.XmlConfigurator.Configure(); 

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

24
Greg Domjan

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

Action de construction: contenu

Copier dans le répertoire de sortie: Copier toujours

18
Lewis Moten

Soit utilisation,

<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 figurer 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.

9
Byju

Attention à ce problème ...

Dans mon cas, tout était 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 qu'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 lire plus ici:

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

J'ai demandé à l'équipe de support de réinitialiser les listes de contrôle d'accès, puis log4net a commencé à cracher des journaux. :)

1
Leniel Maccaferri

Il est également possible d'activer un mode de débogage pour log4net. Insérez ceci 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 extraire ce qui ne va pas Dans mon cas, j'ai simplement oublié de définir Copy to output directory sur Copy Always.

1
waka

En supposant que vous aviez un fichier de configuration externe appelé log4net.config 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());
        }
    }
}
1
JJ_Coder4Hire

Dans mon cas, j'ai eu ce message d'erreur:

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

Etlog4net.configle fichier était dans le projet Visual Studio 2017, mais lorsque j'ai vérifié le fichier dansbin\Debugdossier, je ne pouvais pas le trouver.

Ma configuration d'assemblage d'origine était la suivante:

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

Après quelques temps de recherche, je le modifie comme suit:

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

@Mitch, il s'avère qu'il existe un fichier avec la déclaration [Assembly: ...], mais il ne possédait pas la propriété ConfigFile. 

Une fois que je l'ai ajouté et indiqué à Log.config, cela a commencé à fonctionner. J'aurais pensé que cela fonctionnerait comme toutes les autres sections de configuration (par exemple, 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 global de journaux statiques.

0
Robert Wagner

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.

0
TheGuest
  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 vers Copier si plus récent

  1. Vérifiez le niveau de journalisation valeur de niveau = "ALL"
0
e03050