2009-07-19 5 views
9

Je suis mettre en œuvre un formatter XML personnalisé pour log4.netcomment se connecter nom de la méthode lors de l'utilisation classe wrapper avec Log4net

public class ISDSApplicationEventsLayout : XmlLayoutBase 
{ 
    protected override void FormatXml(...) 
    { 
     //Location Info 
     writer.WriteStartElement("Method"); 
     writer.WriteString(**loggingEvent.LocationInformation.MethodName * *); 
     writer.WriteEndElement(); 
    } 
} 

Le problème est ... maintenant quand je l'appelle méthode du journal de ma classe wrapper journal. .. appelée exploitation forestière

public static void logEvent(string message) 
{ 
    log.Info(isdsLog); 
} 

Je reçois la sortie ....

<Method>logEvent</Method> 

Comment est-il possible d'avoir le nom de la méthode qui a appelé LogEvent, plutôt que LogEvent comme nom de la méthode?

Merci

Question Mise à jour:

Si cela semble au-dessus un peu compliqué - ce que je vous demande vraiment est: Comment gardez-vous le contexte de la méthode qui a appelé la fonction d'enregistrement d'emballage en log4net ...

exemple ... méthode DoWork() ... appelle -> wrapper d'enregistrement -> appels log4net ....

Comment faites-vous MethodName = DoWork et ne pas vous déconnecter WRA fonction pper ....

+0

Copie possible de [Lors de l'utilisation de wrapper, comment conserver le nom de la classe et de la méthode pour Log4Net à enregistrer?] (Http: // stackoverflow.com/questions/2049992/when-using-wrapper-comment-préserver-class-and-method-name-for-log4net-to-log) –

Répondre

14

En fait, vous pouvez facilement résoudre ce problème avec le log4net prêt à l'emploi. Votre wrapper peut appeler Logger.Log et transmettre le type de votre classe wrapper en tant que premier paramètre. Ainsi, votre emballage pourrait ressembler à ceci:

public class MyLog4NetWrapper 
{ 
    ILog log = LogManager.GetLogger("WhateverYourLoggerNameIs"); 

    public void logEvent(string message) 
    {  
    log.Logger.Log(typeof(MyLog4NetWrapper), LogLevel.Info, message, null); 
    } 
} 

Lorsque log4net enregistre un message, il parcourt la pile d'appel jusqu'à ce qu'il arrive à la méthode dont le type déclarant est égal au type passé comme le premier paramètre de la méthode Log. La méthode suivante dans la pile est le site d'appel réel.

En ce qui concerne l'emballage de l'enregistreur log4net, je ne suis pas sûr de recommander la création d'une classe d'encapsulation statique. Le principal problème avec cela est que vous ne pouvez avoir qu'un seul enregistreur configurable dans votre fichier app.config. En d'autres termes, vous ne serez pas en mesure de contrôler indépendamment la journalisation à partir de différentes parties de votre code. Si vous avez la classe A et la classe B et que les deux utilisent votre enregistreur statique, les deux classes se connecteront au même niveau. Si vous vouliez activer la connexion pour la classe A et désactiver pour la classe B, vous ne seriez pas en mesure de le faire.

+0

Ah bien sûr, parfois on ne voit pas ce qui vous regarde en face. Eh bien, si vous fixez votre code à 'log.Logger.Log (...)' au moins :) –

+0

Oui, vous avez raison! Je vais corriger l'exemple de code. – wageoghe

1

Je ne pense pas que vous pouvez facilement résoudre ce problème avec log4net prêt à l'emploi. Si nous jetons un coup d'œil à la méthode ILog.Info dans the LogImpl class, que vous appelez:

virtual public void Info(object message) 
    { 
     Logger.Log(ThisDeclaringType, m_levelInfo, message, null); 
    } 

Lorsqu'un message est enregistré, log4net marcheront le stacktrace de l'appel en cours afin de trouver la méthode qui a initié la opération de journalisation. Pour ce faire, Log4net utilise le type "ThisDeclaringType" comme limite de la recherche, le premier appel "above" dans ce type est choisi comme méthode initiatrice.

Dans votre cas, la première méthode rencontrée est la méthode logEvent. Si vous avez supprimé l'encapsuleur logEvent et utilisé les méthodes de journalisation directement, vous obtiendrez les informations souhaitées.

+0

En fait, il est possible de créer un wrapper de logger qui peut conserver l'appel avec succès Informations sur le site. Voir l'exemple de code dans ma réponse pour un moyen de le faire. La clé transmet le type du consignateur enveloppé en tant que premier paramètre de la méthode Log (plutôt que d'utiliser les méthodes Info, Debug, etc.). – wageoghe

Questions connexes