J'essaie d'écrire un code C #, qui récupère en exécution le modèle de nom du nom d'un log4net em> via l'API log4net. c'est-à-dire, si dans log4net.config em> L'appendeur suivant est défini: p> <appender name="MyAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%date{yyyy}\%date{MM}\%date{dd}\%property{Id}.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="16" />
<maximumFileSize value="1MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
</appender>
4 Réponses :
La valeur de ce modèle sera dans le Obtenir au appender peut se faire de deux façons différentes. P>
À partir de là, il suffit de regarder à travers la recherche d'un appender du type correct (par exemple code> d'un
FileAppender code> instance qui fait partie de votre référentiel d'enregistrement. P>
ILogger code> instance (par exemple, ce que vous obtenez de
LogManager.GetLogger () code>) puis il y a un
appenders code> sur elle . Cela vous donnera des appenders associés à ce niveau spécifique de la hiérarchie de l'exploitation forestière. Li>
LogManager.GetRepository () code> pour obtenir un
heirarchy code> qui contient l'ensemble de l'enregistreur et appender heirarchy. Le procédé prévoit un ensemble, de sorte passer
GetCallingAssembly ( ) code>
pour obtenir une par défaut. Cette classe a un GetAppenders () code> qui retourne tous les appenders configurés, mais il ne vous dira pas ceux qui sont associés à qui loggers. Li>
ol>
FileAppender code> ou
RollingFileAppender code>), lisez alors il est
code> . p>
Je pense que cela ne fonctionne pas. La propriété Fichier est déjà évaluée à ce stade. Donc, il ne contiendra plus date de date {aaaa} \% date {mm} \% date {dd} ... code> mais
2012 \ 09 \ ... code>.
@Michael Wolfgang est absolument raison: lors de la récupération de la propriété fichier i> a été déjà évaluée, et je n'ai pas pu obtenir la valeur de modèle d'origine.
hrm. Vous avez raison, j'ai toujours utilisé cela pour simplement obtenir le chemin (que nous ne stimulons généralement pas) et jamais remarqué. Ces données doivent être disponibles quelque part parce que le motif est recalculé à un moment donné, laissez-moi creuser plus profondément.
Je pense que vous souhaitez sous-classe RollingFileAppender et utilisez votre sous-classe dans le fichier de configuration, au lieu de la classe de base. Assurez-vous de préfixer le nom de classe avec un espace de nom complet afin que Log4net puisse le trouver.
Je n'ai qu'un UDPappender sous-classé dans mon code. J'ai ajouté un remplacement comme celui-ci: p>
public override void ActivateOptions() { base.ActivateOptions(); }
Malheureusement, une instance de rollingfileApender i> est déjà définie avec le nom de fichier évalué et ignore le modèle de nom de fichier. Je suppose que le dernier objet qui voit ce modèle est une instance de log4net.repository.hierarchy.xmlhierarchyconfigurator i> dans la méthode ParseAppender () i>. Dans ce cas, le seul moyen d'atteindre ce que j'ai besoin est effectivement analyser le fichier de configuration seul (yuck!) ...
Oh, j'ai mal compris. Vous voulez que le modèle lui-même. Je suppose que quelqu'un pourrait changer le modèle et que vous ne voulez pas le régler via le code (si vous savez à l'avance)?
L'explication de Michael Edenfield est bonne. Voici la réalisation.
private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); string fileName = ((RollingFileAppender)log.Logger.Repository.GetCurrentLoggers() .Where(e => e.Name == "Your namespace.class").ToList()[0] .Repository.GetAppenders() .Where(e => e.Name == "MyAppender").ToList()[0]).File.ToString();
Je peux obtenir la valeur du
((log4net.Appender.FileAppender) ((log4net.Appender.IAppender[])
( (log4net.Repository.Hierarchy.Logger)
log.Logger).Appenders.SyncRoot)[0]).File