8
votes

Comment obtenir le modèle de nom du fichier journal log4net programme par programme?

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>


0 commentaires

4 Réponses :


2
votes

La valeur de ce modèle sera dans le d'un FileAppender instance qui fait partie de votre référentiel d'enregistrement.

Obtenir au appender peut se faire de deux façons différentes.

  1. Si vous avez déjà un ILogger instance (par exemple, ce que vous obtenez de LogManager.GetLogger () ) puis il y a un appenders sur elle . Cela vous donnera des appenders associés à ce niveau spécifique de la hiérarchie de l'exploitation forestière.
  2. Vous pouvez aussi appeler LogManager.GetRepository () pour obtenir un heirarchy qui contient l'ensemble de l'enregistreur et appender heirarchy. Le procédé prévoit un ensemble, de sorte passer GetCallingAssembly ( ) pour obtenir une par défaut. Cette classe a un GetAppenders () qui retourne tous les appenders configurés, mais il ne vous dira pas ceux qui sont associés à qui loggers.

    À partir de là, il suffit de regarder à travers la recherche d'un appender du type correct (par exemple FileAppender ou RollingFileAppender ), lisez alors il est .


3 commentaires

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} ... mais 2012 \ 09 \ ... .


@Michael Wolfgang est absolument raison: lors de la récupération de la propriété fichier 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.



0
votes

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();
    }


2 commentaires

Malheureusement, une instance de rollingfileApender 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 dans la méthode ParseAppender () . 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)?



1
votes

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();


0 commentaires

0
votes

Je peux obtenir la valeur du code> avec le code suivant:

((log4net.Appender.FileAppender) ((log4net.Appender.IAppender[])
            ( (log4net.Repository.Hierarchy.Logger)
                log.Logger).Appenders.SyncRoot)[0]).File


0 commentaires