Question

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, lors de l'exécution de l'application, aucun fichier journal n'est créé (et aucune journalisation n'est effectuée). Aucun message d'erreur ne s'affiche sur 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 fonctionnera comme prévu. Vous ne savez pas pourquoi cela ne fonctionne pas dans un fichier externe?

Était-ce utile?

La solution

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

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

et le code comme celui-ci au début de chaque classe nécessitant une fonctionnalité de journalisation:

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

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

Autres conseils

Il existe 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 uniquement, utilisez la clé log4net.Config dans appSettings.

Étape 1: incluez la définition de 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 à la mise au point d’un correctif afin de résoudre le problème de la gestion de configSource.

L'étape manquée est

.
log4net.Config.XmlConfigurator.Configure(); 

Cela provoquera l’utilisation de configSource. Assurez-vous de l'appeler une fois avant d'appeler GetLogger ();

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

Action de génération: contenu

Copier dans le répertoire de sortie: Toujours copier

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 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. Action de compilation - Contenu et copie dans le répertoire de sortie - Copier toujours

Faites 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 le réinitialiser 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 à ce sujet ici:

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

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

En supposant que vous ayez 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());
        }
    }
}

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

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

dans le projet en cours, la ligne suivante figurait également 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.

Il est également possible d'activer le mode 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 tout simplement oublié de définir Copier dans le répertoire de sortie sur Copier toujours .

@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 (c.-à-d. 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.

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

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

Et log4net.config le fichier était dans le projet Visual Studio 2017, mais lorsque j'ai vérifié le fichier dans bin \ Debug Je ne pouvais pas le trouver.

La configuration de mon 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)]
  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

remplacez Copier dans le répertoire de sortie par Copier si plus récent

  1. Vérifiez le niveau de journalisation  valeur de niveau = " ALL "
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top