J'utilise Log4net dans une solution c #, qui contient 3 projets dans une solution. Je veux utiliser la même instance de cet enregistreur pour me connecter dans un fichier. voici l'App.Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>

  <log4net>
    <appender name="TestAppender" type="log4net.Appender.RollingFileAppender" >
      <file value="C:\log\MyTestAppender.log" />
      <!--<file value="../../test/MyTestAppender.log" />-->
      <encoding value="utf-8" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <!--<rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="5MB" />
      <staticLogFileName value="true" />-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level  %type.%method - %message%n" />
      </layout>
    </appender>
    <root>
      <level value="All" />
      <!-- If the following line is not included the log file will not be created even if log4net is configured with this file. -->
      <appender-ref ref="TestAppender" />
    </root>
  </log4net>


</configuration>

Et j'ai fait ça pour me connecter

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

Où dois-je mettre ces informations afin de me connecter dans le même fichier journal de tous les projets. Merci beaucoup

0
maher 27 nov. 2017 à 12:14

3 réponses

Meilleure réponse

Vous devez charger le fichier de configuration dans le constructeur statique.

Comme ça

    static LogHelper()
    {
        log4net.Config.XmlConfigurator.ConfigureAndWatch(
            new System.IO.FileInfo(@"AppConfig\log4net.config"));
    }

Le fichier de configuration devrait ressembler à ceci:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!-- Register log4net -->
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    </configSections>
    <log4net>
        <!--log configs -->
    </log4net>
</configuration>
1
Selway 27 nov. 2017 à 09:35

Vous pouvez faire comme ça, je veux dire créer sur une classe statique et créer une instance de journal, et appeler la méthode de journal sur cette classe statique qui n'utilisera qu'une seule instance de journal.

public static class Utility
    {
        private static ILog log = LogManager.GetLogger("CommonLogger");
        public static void LogMessage(string message)
        {
            Task.Factory.StartNew(() => log.Info(message));
        }
}

Ou vous pouvez également utiliser le modèle Singleton pour cela

public Class LogSingleTon
{

    private static readonly Lazy<LogSingleTon> lazy =
        new Lazy<LogSingleTon>(() => new LogSingleTon());

    public static LogSingleTon Instance { get { return lazy.Value; } }
    private ILog log ;
    private LogSingleTon()
    {
        log = LogManager.GetLogger("CommonLogger")
    }
    public void LogMessage(string message)
    {
        Task.Factory.StartNew(() => log.Info(message));
    }      

}

0
Pranay Rana 27 nov. 2017 à 09:28

Si vous utilisez des frameworks d'injection de dépendances, vous pouvez également enregistrer votre logger Log4net en tant que (une) instance et l'injecter là où vous souhaitez l'utiliser.

Par exemple. avec Autofac:

var builder = new ContainerBuilder();

// Log4net
var logger = LogManager.GetLogger("[Whatever name your would like to use for your logger]");
builder.RegisterInstance(logger);
0
Thomas Luijken 27 nov. 2017 à 10:18
47507298