web-dev-qa-db-fra.com

log4net: Comment définir dynamiquement le nom du fichier de l'enregistreur?

C'est une question vraiment courante, mais je n'ai pas pu obtenir de réponse au travail. Voici mon fichier de configuration:

<?xml version="1.0" encoding="utf-8"?>
<log4net>
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="CraneUserInterface.log" />
    <appendToFile value="true" />
    <maxSizeRollBackups value="90" />
    <rollingStyle value="Size" />

    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date - %message%newline" />
    </layout>
  </appender>

  <root>
    <level value="DEBUG" />
    <appender-ref ref="RollingFile" />
  </root>

Mais je dois déterminer le nom réel du fichier de consignation au moment de l'exécution. J'ai trouvé un bel exemple ici , mais lorsque j'essaie de parcourir la collection retournée par l'appel à GetIterators (), je trouve que cette collection est vide.

Je dois changer le nom "CraneUserInterface.log" en "CraneUserInterface_1.log", ou 2 ou 3, selon quelque chose que le programme lit au moment de l'exécution. Comment puis je faire ça?

Voici ma première passe à utiliser le code présenté dans cet exemple:

static bool ChangeLogFileName(string AppenderName, string NewFilename)
{           
   // log4net.Repository.ILoggerRepository RootRep;
   // RootRep = log4net.LogManager.GetRepository();
   log4net.Repository.ILoggerRepository RootRep = m_logger.Logger.Repository;
   foreach (log4net.Appender.IAppender iApp in RootRep.GetAppenders())
   {
   string appenderName = iApp.Name;
   if (iApp.Name.CompareTo(AppenderName) == 0
       && iApp is log4net.Appender.FileAppender)
   {
       log4net.Appender.FileAppender fApp = (log4net.Appender.FileAppender)iApp;
       fApp.File = NewFilename;
       fApp.ActivateOptions();
       return true; // Appender found and name changed to NewFilename
   }
}
return false; // appender not found
}

Merci beaucoup!

15
ROBERT RICHARDSON

Qu'en est-il de l'utilisation de "% property" pour définir une "balise" dynamique au nom du fichier (au moment de l'exécution)?

<file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />

Expliqué ici: Meilleur moyen de définir dynamiquement un chemin de fichier appender

8
Luciano

vous pouvez utiliser cette fonction: dans cette fonction, obtenez d'abord l'emplacement du fichier que vous avez défini dans webconfig et après cela, vous pouvez ajouter le chemin que vous souhaitez! comme Date! notre client ! ou .....

WebConfig:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\\t4\\"/>
    <appendToFile value="true"/>
    <rollingStyle value="Composite"/>
    <datePattern value="_yyyy-MM-dd.lo'g'"/>
    <maxSizeRollBackups value="10"/>
    <maximumFileSize value="1MB"/>
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date User:%identity IP:%X{addr} Browser: %X{browser} Url: %X{url} [%thread] %-5level %c:%m%n"/>
    </layout>
</appender>

Fonction:

public static void ChangeFileLocation(string _CustomerName,string _Project)
{
    XmlConfigurator.Configure();
    log4net.Repository.Hierarchy.Hierarchy h =(log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();

    foreach (IAppender a in h.Root.Appenders)
    {
        if (a is FileAppender)
        {
            FileAppender fa = (FileAppender)a;
            string sNowDate=  DateTime.Now.ToLongDateString();
            // Programmatically set this to the desired location here
            string FileLocationinWebConfig = fa.File;
            string logFileLocation = FileLocationinWebConfig + _Project + "\\" + _CustomerName + "\\" + sNowDate + ".log";

            fa.File = logFileLocation;
            fa.ActivateOptions();
            break;
        }
    }
}

et résultat comme ceci: C:\t4\TestProject\Customer1\samedi 31 août 2013.log

5
Faez Mehrabani