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.