Je recherche des conseils sur la meilleure façon de reconfigurer dynamiquement le niveau de journalisation Log4Net dans mes applications ASP.NET. J'utilise généralement une configuration simple où l'enregistreur racine définit le niveau de journalisation par défaut, par ex.Reconfigurer dynamiquement Log4Net
<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 pour définir les niveaux de journalisation qu'ils utilisent.
La première chose que je voudrais être en mesure de le faire serait de permettre aux administrateurs de se connecter à une page d'administration qui leur permet de (a) voir le niveau actuel de l'enregistreur de racine et (b) dynamiquement changes le. Je ne veux pas utiliser "ConfigureAndWatch" et écrire dans le fichier de configuration sur le disque car je ne veux pas que ces modifications persistent lorsque l'application est recyclée. Ensuite, je voudrais aller plus loin, et sur une page Admin, je peux afficher un TreeView avec tous les Loggers existants dans l'application, et leur niveau d'enregistrement actuel. Et permettre à l'administrateur de pouvoir modifier le niveau de consignation de manière sélective à n'importe quel niveau de la hiérarchie.
L'idée est de créer une page d'administration générique que je peux mettre dans toutes mes applications qui permet aux administrateurs d'activer sélectivement l'enregistrement de niveau DEBUG dynamique à des fins de dépannage. Je trouve les API Log4Net un peu déroutantes, quelqu'un peut-il pointer vers des échantillons ou montrer le meilleur moyen d'y parvenir.
Mise à jour:
Les deux réponses sont aussi bons, donc je l'ai accepté le premier - merci. Pour reprendre, je peux obtenir tous les enregistreurs actuels 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 efficace - même que niveau si celui-ci est non nul, autrement hérité du parent.
Au moins un des loggers renvoyés ci-dessus aura l'enregistreur racine en tant que parent, ce qui me permet d'obtenir une référence à l'enregistreur racine.
Avec ce qui précède, il devrait être possible de reconstruire la hiérarchie de l'enregistreur.
Update 2
Merci encore. J'ai implémenté un contrôle serveur ASP.NET qui affiche la hiérarchie du journal dans une TreeView avec des cases à cocher, et permet à l'utilisateur de modifier dynamiquement le niveau de journalisation à n'importe quel nœud de la hiérarchie. Fonctionne très bien et je vais le mettre sur la page d'administration dans toutes mes applications Web ASP.NET et Web Service!
J'ai testé le code ci-dessus et trouvé que je devais faire une boucle à travers tous les dépôts et vérifier le type. foreach (repo var dans LogManager.GetAllRepositories()) foreach (. Enregistreur de var dans repo.GetCurrentLoggers() OfType()) = Niveau logger.level; –
FYI: J'ai déjà rencontré des problèmes de concurrence lors de l'utilisation de l'API de configuration log4net dynamique - il ne semble pas être sûr pour les threads. – galaktor
quelle version de log4net était-ce avec? Je ne vois aucune implémentation d'ILog qui peut être convertie en Repository.Hierarchy.Logger –