Szukam wskazówek na temat najlepszego sposobu ponownego skonfigurowania poziomu rejestrowania Log4Net w aplikacjach ASP.NET. Generalnie używam prostej konfiguracji, w której program rejestrujący root definiuje domyślny poziom rejestrowania, np.Dynamicznie rekonfiguruj Log4Net
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="..." />
<appender-ref ref="..." />
... etc ...
</root>
... etc
i może być kilka elementów dodających, każdy z filtrami do definiowania poziomów rejestrowania, z których korzystają.
Pierwszą rzeczą Chciałbym móc zrobić byłoby, aby umożliwić administratorom podłączyć do strony administracyjnej, która umożliwia im (a) wyświetlić aktualny poziom dla rejestratora głównego oraz (b) dynamicznie Zmień to. Nie chcę używać "ConfigureAndWatch" i pisać do pliku konfiguracyjnego na dysku, ponieważ nie chcę, aby te zmiany pozostały, gdy aplikacja zostanie poddana recyklingowi.
Następnie chciałbym pójść dalej, a na stronie administratora być w stanie wyświetlić TreeView ze wszystkimi aktualnymi Loggerami, które istnieją w aplikacji i ich bieżącym poziomem logowania. I pozwolić administratorowi na selektywną zmianę poziomu rejestrowania na dowolnym poziomie hierarchii.
Chodzi o to, aby stworzyć ogólną stronę administratora, które można umieścić na wszystkich moich aplikacji, które umożliwia administratorom selektywnie włączyć dynamicznie rejestrowanie debugowania szczebla w celu rozwiązywania problemów.
Uważam, że interfejsy API Log4Net są nieco mylące, każdy może wskazać próbki lub pokazać najlepszy sposób osiągnięcia tego.
Aktualizacja:
Obie odpowiedzi są równie dobre, więc ja przyjąłem pierwszy - dzięki. Aby powtórzy, można uzyskać wszystkie aktualne rejestratory następująco:
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 jest skuteczny - tak samo jak poziom, jeżeli ten ostatni nie jest null, inaczej dziedziczone od rodziców.
Przynajmniej jeden z rejestratorów zwróconych powyżej będzie miał program rejestrujący root jako obiekt nadrzędny, co umożliwi mi uzyskanie odwołania do programu rejestrującego root.
W powyższej kolejności powinna istnieć możliwość zrekonstruowania hierarchii rejestratora.
Aktualizacja 2
Dzięki jeszcze raz. Zaimplementowałem kontrolkę serwera ASP.NET, która wyświetla hierarchię rejestratora w TreeView z polami wyboru i pozwala użytkownikowi dynamicznie zmieniać poziom rejestrowania w dowolnym węźle hierarchii. Działa świetnie i będę umieszczać go na stronie administratora we wszystkich moich aplikacjach ASP.NET Web i Web Service!
Testowałem powyższy kod i okazało się, że muszę do pętli wszystkich repozytoriów i dwukrotnie sprawdzić typ. foreach (var repo LogManager.GetAllRepositories()) foreach (. Var rejestrator w repo.GetCurrentLoggers() OfType()) logger.Level = Poziom; –
FYI: Kiedyś używałem dynamicznego interfejsu API log4net do rozwiązywania problemów z współbieżnością - wygląda na to, że nie jest bezpieczny dla wątków. – galaktor
z jaką wersją log4net to było? Nie widzę żadnych implementacji ILog, które można rzutować na Repository.Hierarchy.Logger –