Comment spécifier le dossier de données d'application commun pour log4net ?
-
19-08-2019 - |
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 ?
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.