web-dev-qa-db-fra.com

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

Je veux que log4net écrive les fichiers journaux (à l'aide de RollingFileAppender) dans un sous-dossier du dossier de données d'application commun (par exemple, C:\Documents and Settings\Tous les utilisateurs\Application Data\Société\Produit\Journaux).
Cependant, sous Win XP, aucune variable d’environnement ne spécifie ce dossier. Nous avons %ALLUSERSPROFILE%, nous avons %APPDATA%, mais rien ne ressemble à %ALLUSERSAPPDATA%.
Par programmation, je pourrais utiliser Environment.SpecialFolder.CommonApplicationData, mais je dois le mettre dans la configuration log4net, à peu près 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 a une meilleure idée?

35
user57474

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

12
pilif

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>
33
pduncan

Voici le code complet de la liste de diffusion log4net auquel pilif est lié:

Fondamentalement, la méthode consiste à implémenter un convertisseur de modèle 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>

En gros, le %folder lui dit de regarder le convertisseur appelé folder qui le dirige vers la classe SpecialFolderPatternConverter. Il appelle ensuite Convert sur cette classe, en transmettant la valeur enum CommonApplicationData (ou autre).

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

11
codeulike

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>
3
user2126375

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\

0
Apfelkuacha

Maintenant (en 2018 FEB) conformément à la version 2.0.8.0 de log4net.

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

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

Reportez-vous à: log4net.Util.PatternString class documentation pour plus de détails.

0
Mohamed Navas