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?
Cette publication sur la liste de diffusion log4net explique comment vous pouvez définir vos propres variables de remplacement de chemin.
Nous utilisons simplement ceci:
<param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>
Ça marche très bien.
<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 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 .
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) 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.