9
votes

Comment connecter le nom de la méthode lors de l'utilisation de la classe wrapper avec log4net

Je suis implémentant un formateur XML personnalisé pour log4.net xxx

Le problème est ... Maintenant, lorsque je appelle la méthode du journal de ma classe wrapper ... appelé journalisation xxx

i obtenir la sortie .... xxx

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

Merci

Mise à jour de la question:

Si ceci semble un peu compliqué - ce que je suis Vous demandez vraiment: comment conservez-vous le contexte de la méthode appelée la fonction de journalisation d'emballage dans log4net ...

Exemple ... Méthode Dowork () ... Appels -> Wrapper de journalisation -> Appels log4net ....

Comment faites-vous la méthodeNAME = Dowork et non de connecter la fonction wrapper ....


3 Réponses :


1
votes

Je ne pense pas que vous puissiez facilement résoudre ce problème avec Log4Net hors de la case. Si nous jetons un coup d'oeil à la méthode Ilog.info dans La classe LogiMPL , que vous appelez:

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


1 commentaires

En fait, il est possible de créer un wrapper d'enregistrement pouvant conserver avec succès les informations sur le site d'appel. Voir l'échantillon de code dans ma réponse pour un moyen de le faire. La clé transmet le type de l'enregistreur enveloppé comme le premier paramètre à la méthode du journal (plutôt que d'utiliser l'info, le débogage, les méthodes de l'etque).



18
votes

En réalité, vous pouvez réparer cela facilement avec le log4Net hors de la case. Votre wrapper peut appeler logger.log et transmettre le type de votre classe wrapper comme premier paramètre. Donc, votre wrapper pourrait ressembler à quelque chose comme ceci:

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

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


2 commentaires

Bien sûr, parfois on ne voit pas ce qui vous regarde dans le visage. Eh bien, si vous corrigez votre code sur log.logger.log (...) au moins :)


@wageoghe: Je suivais ce modèle et cela fonctionnait bien, jusqu'à ce que je déploie l'application en mode de sortie. Il sauve "?" . Des pensées pour résoudre ce problème?



0
votes

wrirer pour log4net enregistreur en 3 étapes:

Ajouter une référence au paquet log4net (NuTetPackage) p>

Ajoutez votre classe d'emballage, assurez-vous d'appeler log4net.config.xmlconfigurator.configure (); dans un constructeur statique de votre classe wrapper. Ceci charge toutes la configuration de votre app.config. P>

Ajouter la configuration log4net dans votre application.Config p>

Voir la classe d'enveloppement d'échantillonnage ci-dessous. P>

  public class Logger : ILogger
{
    private static readonly log4net.ILog log;


    static Logger()
    {
        log = log4net.LogManager.GetLogger(System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType);
        log4net.Config.XmlConfigurator.Configure();
    }

    public void Log(LogLevel logLevel, string message, params object[] args)
    {
        switch (logLevel)
        {
            case LogLevel.DEBUG: {
                    // log.Logger.Log helps logging actual method and the class which has called this method (Log(LogLevel logLevel, string message, params object[] args))
                    log.Logger.Log(typeof(Logger), log4net.Core.Level.Debug, string.Format(message, args), null);
                    break;
                }
            case LogLevel.INFO:
                {                       
                    log.Logger.Log(typeof(Logger), log4net.Core.Level.Info, string.Format( message, args) , null);
                    break;
                }
            case LogLevel.ERROR:
                {
                    log.Logger.Log(typeof(Logger), log4net.Core.Level.Error, string.Format(message, args), null);
                    break;
                }
            case LogLevel.WARN:
                {
                    log.Logger.Log(typeof(Logger), log4net.Core.Level.Warn, string.Format(message, args), null);
                    break;
                }
        }

    }

    public void LogException(LogLevel logLevel, Exception exception)
    {
        Log(logLevel, exception.ToString());
    }
}


0 commentaires