Question

Je souhaite que log4net écrive les fichiers journaux (à l'aide de RollingFileAppender) dans un sous-dossier du dossier de données d'application commun (par ex.C:\Documents and Settings ous les utilisateurs\Application Data\Company\Product\Logs).
Cependant, sous Win XP, aucune variable d'environnement ne spécifie ce dossier.Nous avons %ALLUSERSPROFILE%, nous avons %APPDATA%, mais il n'y a rien de tel %ALLUSERSAPPDATA%.
Par programme, je pourrais utiliser Environment.SpecialFolder.CommonApplicationData, mais je dois le mettre dans la configuration log4net, quelque chose comme ceci :

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
   <file value="%ALLUSERSAPPDATA%\Company\Product\Logs\error.log" />
</appender>

OK, nous pourrions définir cela dans notre configuration, mais peut-être que quelqu'un aura une meilleure idée ?

Était-ce utile?

La solution

Cette publication sur le journal log4net mailinglist explique comment vous pouvez définir vos propres variables de remplacement de chemin.

Autres conseils

Nous utilisons simplement ceci:

<param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>

Cela fonctionne très bien.


Cette ligne peut simplement être insérée dans votre configuration actuelle d'appender:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
   <param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>
</appender>

Voici le code complet de la liste de diffusion log4net qui pilif lié à:

Fondamentalement, la méthode consiste à implémenter un convertisseur de modèles personnalisé pour le fichier de configuration log4net.

Ajoutez d’abord cette classe à votre projet :

public class SpecialFolderPatternConverter : log4net.Util.PatternConverter
{
    override protected void Convert(System.IO.TextWriter writer, object state)
    {
        Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true);
        writer.Write(Environment.GetFolderPath(specialFolder));
    }
}

Configurez ensuite le paramètre File de votre FileAppender comme suit :

<file type="log4net.Util.PatternString">
    <converter>
      <name value="folder" />
      <type value="MyAppName.SpecialFolderPatternConverter,MyAppName" />
    </converter>
    <conversionPattern value="%folder{CommonApplicationData}\\SomeOtherFolder\\log.txt" />
</file>

Fondamentalement le %folder lui dit de regarder le convertisseur appelé folder ce qui le pointe vers la classe SpecialFolderPatternConverter.Il appelle alors Convert sur cette classe, en transmettant la valeur d'énumération CommonApplicationData (ou autre).

Apparemment, dans la prochaine version de log4net (1.2.11), il y aura une méthode plus simple, comme décrit ici.

Solution complète et fonctionnelle - contenu de mon fichier Log4net.config. Dans la version actuelle de Log4Net, il n’est plus nécessaire d’écrire son propre convertisseur de modèle.

<?xml version="1.0"?>
<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="LogFileAppender" />
  </root>
  <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
    <file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\MyProject\\Logs\\log.txt" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="100MB" />
    <layout type="log4net.Layout.PatternLayout">
      <ConversionPattern type="log4net.Util.PatternString" value="%%-5p %%d{yyyy-MM-dd HH:mm:ss} - %%m%%n" />
    </layout>
  </appender>
</log4net>

Dans la version actuelle de log4net (2.0.8.0), vous pouvez simplement utiliser

<file value="${ProgramData}\myFolder\LogFiles\" /> pour C:\ProgramData

${LocalAppData} pour C:\Users\user\AppData\Local\

et ${AppData} pour C:\Users\user\AppData\Roaming\

Maintenant (en 2018 FEB) selon log4net version 2.0.8.0.

Vous pouvez utiliser sans convertisseur pour obtenir les variables d’environnement comme suit.

<file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\mylogfile.txt" />

Voir: log4net.Util.PatternString documentation de la classe pour plus de détails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top