web-dev-qa-db-fra.com

Meilleure façon de définir de manière dynamique un chemin de fichier d'appender

J'essaie de trouver quelqu'un de plus intelligent que moi pour valider la syntaxe que j'ai écrite. L'idée est de configurer le nom de fichier de mon RollingFileAppender avec le nom de l'assembly afin de le rendre plus réutilisable pour mes projets. 

J'ai vu cet article SO précédent mais il n'a pas été en mesure de répondre à ma question ...

J'ai eu la peine une fois de temps à essayer de comprendre les composants internes de Log4net et voici ce que j'ai proposé (résidant dans le fichier Global.asax - méthode Application_Start):

// Bind to the root hierarchy of log4net
log4net.Repository.Hierarchy.Hierarchy root = 
  log4net.LogManager.GetRepository() 
    as log4net.Repository.Hierarchy.Hierarchy;

if (root != null)
{
  // Bind to the RollingFileAppender
  log4net.Appender.RollingFileAppender rfa = 
    (log4net.Appender.RollingFileAppender)root.Root.GetAppender("RollingLogFileAppender");

  if (rfa != null)
  {
    // Set the file name based on the Assembly name
    string filePath = 
      string.Format("~/App_Data/{0}.log", GetType().Assembly.GetName().Name);

    // Assign the value to the appender
    rfa.File = Server.MapPath(filePath);

    // Apply changes to the appender
    rfa.ActivateOptions();
  }
}

Quelqu'un peut-il me dire: "c'est hideux" ou "ça devrait marcher"? De plus, si je définis le fichier de manière dynamique, puis-je toujours espérer que le comportement de log4net fera pivoter les fichiers en fonction des paramètres du fichier log4net.config?

Très appréciée!

36
Dscoduc

Vous faites cela à la dure! Définissez votre configuration log4net en tant que XML dans le fichier de configuration de votre application et utilisez %property{} pour en tirer avantage:

<appender name="YourAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />
  ....
</appender>

C’est dynamique - il vous suffit de définir la propriété log4net "LogName" avant vous initialisez log4net. Ainsi, dans votre code à tout moment avant de configurer log4net, définissez la valeur souhaitée de cette propriété:

string LogName = GetType().Assembly.GetName().Name + ".log";
log4net.GlobalContext.Properties["LogName"] = LogName;

Bien sûr, vous pouvez utiliser n'importe quel nom de propriété. J'ai choisi "LogName" pour un exemple simple, mais vous pouvez en avoir un par application si vous le souhaitez, à condition que votre code connaisse le nom correct de la propriété et la valeur correcte.

88
Eddie

En 2015, nous le faisons comme ceci:

<file type="log4net.Util.PatternString">
  <conversionPattern value="%appdomain.log" />
</file>

Aucun autre code requis.

Domaine d'application est le nom de fichier de l'Assemblée en cours d'exécution.

8
Sebastian Häni

Voici le moyen de définir ou de modifier le fichier journal du premier appender au moment de l'exécution:

var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0];
appender.File = "C:\whatever.log";
appender.ActivateOptions();
8
Peter J. de Bruin

cela a fonctionné pour moi avec la date <file type="log4net.Util.PatternString" value="./Log/logQueueService%date{yyyy_MM_dd}.log" />

0
jhovanny gonzalez