56 votes

Que serait un Log4Net classe Wrapper?

J'ai été à la recherche pour un de journalisation .net (c#) et a décidé de donner log4net un aller après avoir lu sur quelques questions/réponses, les discussions ici sur stackoverflow. Je vois des gens de mentionner encore et qu'ils utilisent une classe wrapper pour log4net et je suis me demande de quoi ça pourrait ressembler.

J'ai mon code réparti dans différents projets (accès aux données/business/webservice/..). Comment un log4net classe wrapper? Serait la classe wrapper doivent être inclus dans tous les projets? Dois-je construire un projet distinct, tous ensemble?

Si le wrapper être une classe singleton?

51voto

cfeduke Points 13153

Essentiellement, vous créez une interface, puis une mise en œuvre concrète de cette interface qui encapsule les classes et les méthodes de Log4net directement. Supplémentaires de systèmes d'enregistrement peut être enveloppé par la création de plus de classes concrètes qui enveloppez les autres classes et les méthodes de ces systèmes. Enfin, utiliser une usine à créer des instances de vos papiers d'emballage basé sur un paramètre de la configuration ou de la ligne de changement de code. (Note: vous pouvez obtenir plus flexible et complexe à l'aide d'une Inversion de Contrôle conteneur comme StructureMap.)

public interface ILogger
{
    void Debug(object message);
    bool IsDebugEnabled { get; }

    // continue for all methods like Error, Fatal ...
}

public class Log4NetWrapper : ILogger
{
    private readonly log4net.ILog _logger;

    public Log4NetWrapper(Type type)
    {
        _logger = log4net.LogManager.GetLogger(type);
    }

    public void Debug(object message)
    {
        _logger.Debug(message);
    }

    public bool IsDebugEnabled
    {
        get { return _logger.IsDebugEnabled; }
    }

    // complete ILogger interface implementation
}

public static class LogManager
{
    public static ILogger GetLogger(Type type)
    {
        // if configuration file says log4net...
        return new Log4NetWrapper(type);
        // if it says Joe's Logger...
        // return new JoesLoggerWrapper(type);
    }
}

Et un exemple d'utilisation de ce code dans vos classes (déclarée static readonly champ):

private static readonly ILogger _logger =
    LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

Vous pouvez obtenir le même légèrement plus de performance amical effet à l'aide de:

private static readonly ILogger _logger = 
    LogManager.GetLogger(typeof(YourTypeName));

L'exemple précédent est considéré comme plus facile à gérer.

Vous ne voulez pas créer un Singleton pour gérer tous les enregistrement car Log4Net les journaux de l'invocation de type; son beaucoup plus propre et utile d'avoir chaque type d'utilisation de son propre enregistreur plutôt que la simple vue d'un seul type dans le fichier journal de la déclaration de tous les messages.

Parce que votre mise en œuvre devrait être assez réutilisables (d'autres projets dans votre organisation) vous pouvez le faire de sa propre assemblée ou, idéalement, de l'inclure avec votre propre personnel/cadre de l'organisation/de l'utilitaire d'assemblage. Ne pas re-déclarer les classes séparément dans chacune de vos affaires/data/UI assemblées, ce n'est pas facile à gérer.

24voto

Alconja Points 10626

En supposant que vous alliez avec quelque chose comme cfeduke la réponse ci-dessus, vous pouvez également ajouter une surcharge de votre LogManager comme ceci:

public static ILogger GetLogger()
{
    var stack = new StackTrace();
    var frame = stack.GetFrame(1);
    return new Log4NetWrapper(frame.GetMethod().DeclaringType);
}

De cette façon, dans votre code, vous pouvez maintenant simplement utiliser:

private static readonly ILogger _logger = LogManager.GetLogger();

au lieu de l'un de ces:

private static readonly ILogger _logger =
    LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static readonly ILogger _logger = 
    LogManager.GetLogger(typeof(YourTypeName));

Qui est en fait l'équivalent de la première alternative (c'est à dire celui qui utilise MethodBase.GetCurrentMethod().DeclaringType), seulement un peu plus simple.

0voto

devio Points 22981

Ma compréhension est qu'une classe wrapper pour log4net serait une classe statique qui prend soin de l'initialisation de l'objet connexion à partir de l'app.config/web.config ou par code (par exemple, l'intégration avec NUnit).

0voto

une utilisation possible pour un log4net wrapper pourrait être une classe qui reçoit l'appel de la classe et de la méthode par réflexion pour avoir une idée de l'endroit où votre journalisation d'entrée qui s'est passé. au moins je l'utiliser fréquemment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X