Reconfigurer de manière dynamique Log4Net

Je suis à la recherche pour obtenir des conseils sur la meilleure façon de reconfigurer le Log4Net niveau d'enregistrement de façon dynamique dans mon ASP.NET des apps. J'utilise généralement une configuration simple, où la racine enregistreur définit le niveau d'enregistrement par défaut, par exemple

<log4net>
    <root>
    <level value="INFO" />
    <appender-ref ref="..." />
    <appender-ref ref="..." />
    ... etc ...     
    </root>
    ... etc

et il peut y avoir plusieurs appenders, chacun avec des filtres afin de définir les niveaux d'enregistrement qu'ils utilisent.

  1. La première chose que je voudrais être en mesure de le faire serait de permettre aux Administrateurs de se connecter à un admin de la page, ce qui leur permet de (a) voir le niveau actuel de la racine de l'enregistreur, et (b) de modifier dynamiquement. Je ne veux pas utiliser "ConfigureAndWatch" et écrire dans le fichier de configuration sur le disque parce que je ne veux pas que ces modifications persistent lorsque l'application est recyclé.
  2. Prochaine j'aimerais aller plus loin, et sur une page Admin être en mesure d'afficher un TreeView avec tous les Enregistreurs qui existent dans l'application, et leur niveau d'enregistrement actuel. Et de permettre à l'administrateur pour pouvoir modifier le niveau de journalisation de manière sélective à n'importe quel niveau de la hiérarchie.

L'idée est de créer un générique admin de la page que je peux mettre dans toutes mes applications qui permet aux administrateurs d'activer de façon sélective de DÉBOGAGE au niveau de journalisation de façon dynamique à des fins de dépannage.

- Je trouver les Log4Net Api un peu déroutant, quelqu'un peut-il point d'échantillons ou de montrer la meilleure façon d'atteindre cet objectif.

Mise à jour:

Les deux réponses sont tout aussi bonne, donc j'ai accepté la première grâce. Pour une reprise, je peux obtenir tous les enregistreurs comme suit:

foreach (log4net.ILog log in log4net.LogManager.GetCurrentLoggers())
{
    log4net.Repository.Hierarchy.Logger logger = 
         (log4net.Repository.Hierarchy.Logger)log.Logger;
    Debug.WriteLine(
        String.Format("{0} Parent {1} Level {2} EffectiveLevel {3}<br>",
        logger.Name,
        logger.Parent.Name,
        logger.Level == null ? "<null>" : logger.Level.Name,
        logger.EffectiveLevel
        )
        );
}
  • EffectiveLevel est le niveau effectif - même, comme si ce dernier n'est pas nul, sinon héritées du parent.
  • Au moins l'un des enregistreurs de retourné au-dessus auront la racine logger en tant que parent, ce qui me permet d'obtenir une référence à la racine de l'enregistreur.

Ci-dessus, il devrait être possible de reconstruire l'enregistreur de hiérarchie.

Mise à jour 2

Merci encore. J'ai mis en place un ASP.NET contrôle de serveur qui affiche l'enregistreur de hiérarchie dans un TreeView avec des cases à cocher, et permet à l'utilisateur de modifier dynamiquement le niveau d'enregistrement à n'importe quel nœud dans la hiérarchie. Fonctionne très bien et je vais le mettre sur la page Admin dans tous mes ASP.NET Web et des Services Web apps!

OriginalL'auteur Joe | 2009-04-10