35 votes

Comment spécifier un dossier de données d'application commun pour log4net?

Je veux log4net d'écrire des fichiers journaux (à l'aide de RollingFileAppender) dans un sous-dossier de la commune dossier de données d'application (par ex. C:\Documents and Settings\All Users\Application Data\Company\Produit\Logs).
Cependant, sur Win XP, il n'y a pas de variable d'environnement qui spécifie ce dossier. Nous avons %ALLUSERSPROFILE%, nous avons %APPDATA%, mais il n'y a rien comme %ALLUSERSAPPDATA%.
Par programmation, je pourrais utiliser Environment.SpecialFolder.CommonApplicationData, mais j'ai besoin de le mettre dans le log4net config, quelque chose comme ceci:

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

OK, on pourrait définir cela dans notre configuration, mais peut-être que quelqu'un arrive avec une meilleure idée?

33voto

pduncan Points 654

Nous utilisons simplement ceci:

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

Ça marche 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>
 

12voto

pilif Points 7172

Cette publication sur la liste de diffusion log4net explique comment vous pouvez définir vos propres variables de remplacement de chemin.

12voto

codeulike Points 9017

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

Fondamentalement, la méthode est de mettre en œuvre un modèle personnalisé converter pour la log4net fichier de configuration.

D'abord ajouter 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));
    }
}

Ensuite configurer le Fichier de paramètres 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, l' %folder le raconte à regarder le convertisseur appelés folder de points à la SpecialFolderPatternConverter classe. Elle appelle alors Convert sur cette classe, en passant dans le CommonApplicationData (ou autre) valeur d'enum.

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

3voto

user2126375 Points 179

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>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X