Aktualizacja: Aby uzyskać rozszerzenia System.Diagnostics, podając niektóre brakujące nasłuchiwania, których możesz chcieć, zobacz Essential.Diagnostics w CodePlex ( http://essentialdiagnostics.codeplex.com/ )
Ramy
P: Z jakich ram korzystasz?
Odp .: System.Diagnostics.TraceSource, wbudowany w .NET 2.0.
Zapewnia potężne, elastyczne i wydajne rejestrowanie aplikacji, jednak wielu programistów nie zdaje sobie sprawy z jego możliwości i nie korzysta z nich w pełni.
Istnieje kilka obszarów, w których dodatkowa funkcjonalność jest przydatna lub czasami funkcjonalność istnieje, ale nie jest dobrze udokumentowana, jednak nie oznacza to, że cała struktura rejestrowania (która ma być rozszerzalna) powinna zostać wyrzucona i całkowicie zastąpiona, jak niektóre popularne alternatywy (NLog, log4net, Common.Logging, a nawet rejestrowanie EntLib).
Zamiast zmieniać sposób dodawania instrukcji rejestrowania do aplikacji i ponownego wynalezienia koła, po prostu rozszerzyłem platformę System.Diagnostics w kilku potrzebnych miejscach.
Wydaje mi się, że inne frameworki, nawet EntLib, po prostu cierpią na syndrom Nie wymyślony tutaj i myślę, że zmarnowali czas na ponowne opracowanie podstaw, które już działają doskonale w System.Diagnostics (takich jak pisanie instrukcji dziennika), zamiast uzupełniać kilka istniejących luk. Krótko mówiąc, nie używaj ich - nie są potrzebne.
Funkcje, których możesz nie znać:
- Korzystanie z przeciążeń TraceEvent, które pobierają ciąg formatu i argumenty, może pomóc w wydajności, ponieważ parametry są przechowywane jako osobne odwołania, dopóki nie zakończy się powodzeniem Filter.ShouldTrace (). Oznacza to brak kosztownych wywołań ToString () dla wartości parametrów, dopóki system nie potwierdzi komunikatu.
- Trace.CorrelationManager umożliwia korelowanie instrukcji dziennika dotyczących tej samej operacji logicznej (patrz poniżej).
- VisualBasic.Logging.FileLogTraceListener jest dobry do pisania w plikach dziennika i obsługuje rotację plików. Chociaż w przestrzeni nazw VisualBasic, można go równie łatwo używać w projekcie C # (lub innym języku), po prostu dołączając bibliotekę DLL.
- Gdy używasz EventLogTraceListener, jeśli wywołujesz TraceEvent z wieloma argumentami i ciągiem pustego lub pustego formatu, wówczas argumenty są przekazywane bezpośrednio do EventLog.WriteEntry (), jeśli używasz zlokalizowanych zasobów wiadomości.
- Narzędzie Service Trace Viewer (z WCF) jest przydatne do przeglądania wykresów plików dziennika skorelowanych z aktywnością (nawet jeśli nie używasz WCF). Może to naprawdę pomóc w debugowaniu złożonych problemów, w których bierze udział wiele wątków / działań.
- Unikaj narzutu, usuwając wszystkie detektory (lub usuwając domyślny); w przeciwnym razie Default przekaże wszystko do systemu śledzenia (i poniesie wszystkie te koszty ogólne ToString ()).
Obszary, które warto rozważyć rozszerzenia (w razie potrzeby):
- Detektor śledzenia bazy danych
- Kolorowy odbiornik śledzenia konsoli
- Detektory śledzenia MSMQ / e-mail / WMI (w razie potrzeby)
- Zaimplementuj FileSystemWatcher, aby wywoływać Trace.Refresh w celu dynamicznych zmian konfiguracji
Inne zalecenia:
Użyj identyfikatorów zdarzeń strukturalnych i przechowuj listę referencji (np. Udokumentuj je w wyliczeniu).
Posiadanie unikalnych identyfikatorów zdarzeń dla każdego (znaczącego) zdarzenia w systemie jest bardzo przydatne do korelowania i znajdowania określonych problemów. Łatwo jest wyśledzić konkretny kod, który rejestruje / używa identyfikatorów zdarzeń, i może ułatwić podanie typowych błędów, np. Błąd 5178 oznacza, że łańcuch połączenia z bazą danych jest nieprawidłowy itp.
Identyfikatory zdarzeń powinny mieć jakąś strukturę (podobną do teorii kodów odpowiedzi używanych w wiadomościach e-mail i HTTP), która pozwala traktować je według kategorii bez znajomości określonych kodów.
np. pierwsza cyfra może określać klasę ogólną: 1xxx można użyć do operacji „Start”, 2xxx do normalnego zachowania, 3xxx do śledzenia aktywności, 4xxx do ostrzeżeń, 5xxx do błędów, 8xxx do operacji „Stop”, 9xxx do błędów krytycznych, itp.
Druga cyfra może szczegółowo określać obszar, np. 21xx dla informacji o bazie danych (41xx dla ostrzeżeń bazy danych, 51xx dla błędów bazy danych), 22xx dla trybu obliczeń (42xx dla ostrzeżeń obliczeniowych itp.), 23xx dla innego modułu itp.
Przypisane, ustrukturyzowane identyfikatory zdarzeń pozwalają również używać ich w filtrach.
P: Jeśli korzystasz ze śledzenia, czy korzystasz z Trace.Correlation.StartLogicalOperation?
Odp .: Trace.CorrelationManager jest bardzo przydatny do korelowania instrukcji dziennika w dowolnym środowisku wielowątkowym (co w dzisiejszych czasach jest prawie wszystkim).
Musisz przynajmniej ustawić ActivityId jeden raz dla każdej operacji logicznej, aby dokonać korelacji.
Start / Stop i LogicalOperationStack mogą być następnie użyte w prostym kontekście stosu. W przypadku bardziej złożonych kontekstów (np. Operacji asynchronicznych) użycie TraceTransfer do nowego ActivityId (przed zmianą) pozwala na korelację.
Narzędzie Service Trace Viewer może być przydatne do przeglądania wykresów aktywności (nawet jeśli nie używasz WCF).
P: Czy piszesz ten kod ręcznie, czy używasz do tego jakiejś formy programowania aspektowego? Chcesz udostępnić fragment kodu?
Odp .: Możesz chcieć utworzyć klasę zasięgu, np. LogicalOperationScope, która (a) ustanawia kontekst po utworzeniu i (b) resetuje kontekst po usunięciu.
Umożliwia to pisanie kodu, takiego jak poniżej, w celu automatycznego zawijania operacji:
using( LogicalOperationScope operation = new LogicalOperationScope("Operation") )
{
// .. do work here
}
Podczas tworzenia zakres może najpierw ustawić ActivityId, jeśli to konieczne, wywołać StartLogicalOperation, a następnie zarejestrować komunikat TraceEventType.Start. Przy Dispose może zarejestrować komunikat Stop, a następnie wywołać StopLogicalOperation.
P: Czy zapewniasz jakąkolwiek formę szczegółowości w stosunku do źródeł śledzenia? Np. TraceSources WPF pozwalają skonfigurować je na różnych poziomach.
Odp .: Tak, wiele źródeł śledzenia jest użytecznych / ważnych w miarę powiększania się systemów.
Chociaż prawdopodobnie chcesz konsekwentnie rejestrować wszystkie ostrzeżenia i powyżej lub wszystkie informacje i powyższe komunikaty, dla dowolnego systemu o rozsądnych rozmiarach objętość śledzenia aktywności (Start, Stop itp.) I rejestrowanie pełne stają się po prostu zbyt duże.
Zamiast tylko jednego przełącznika, który włącza lub wyłącza wszystko, warto włączyć te informacje dla jednej sekcji systemu na raz.
W ten sposób możesz zlokalizować znaczące problemy na podstawie zwykłego logowania (wszystkie ostrzeżenia, błędy itp.), A następnie „powiększyć” wybrane sekcje i ustawić je na śledzenie aktywności lub nawet poziomy debugowania.
Liczba potrzebnych źródeł śledzenia zależy od aplikacji, np. Możesz potrzebować jednego źródła śledzenia na zespół lub główną sekcję aplikacji.
Jeśli potrzebujesz jeszcze bardziej precyzyjnej kontroli, dodaj indywidualne przełączniki logiczne, aby włączyć / wyłączyć określone śledzenie dużych głośności, np. Zrzuty nieprzetworzonych wiadomości. (Lub można zastosować osobne źródło śledzenia, podobne do WCF / WPF).
Możesz także rozważyć oddzielne źródła śledzenia dla śledzenia aktywności w porównaniu do rejestrowania ogólnego (inne), ponieważ może to nieco ułatwić skonfigurowanie filtrów dokładnie tak, jak chcesz.
Pamiętaj, że wiadomości mogą być nadal skorelowane przez ActivityId, nawet jeśli używane są różne źródła, więc używaj ich tyle, ile potrzebujesz.
Słuchacze
P: Jakich wyników dziennika używasz?
Może to zależeć od rodzaju aplikacji, którą piszesz i od tego, co jest rejestrowane. Zwykle różne rzeczy idą w różnych miejscach (tj. Wiele wyników).
Generalnie dzielę wyniki na trzy grupy:
(1) Zdarzenia - Dziennik zdarzeń Windows (i pliki śledzenia)
np. jeśli piszesz serwer / usługę, najlepszą praktyką w systemie Windows jest korzystanie z dziennika zdarzeń Windows (nie masz interfejsu użytkownika do zgłoszenia).
W takim przypadku wszystkie zdarzenia krytyczne, błędy, ostrzeżenia i informacje (na poziomie usługi) powinny przejść do dziennika zdarzeń systemu Windows. Poziom informacji powinien być zarezerwowany dla tego rodzaju zdarzeń wysokiego poziomu, które chcesz przejść do dziennika zdarzeń, np. „Uruchomiono usługę”, „Zatrzymano usługę”, „Połączono z Xyz”, a może nawet „Zapoczątkowano harmonogram” , „Zalogowany użytkownik” itp.
W niektórych przypadkach możesz chcieć, aby zapisywanie w dzienniku zdarzeń było wbudowaną częścią aplikacji, a nie przez system śledzenia (tj. Zapisywanie wpisów w dzienniku zdarzeń bezpośrednio). Oznacza to, że nie można go przypadkowo wyłączyć. (Pamiętaj, że nadal chcesz odnotować to samo zdarzenie w systemie śledzenia, abyś mógł skorelować).
W przeciwieństwie do tego aplikacja GUI systemu Windows generalnie zgłasza je użytkownikowi (chociaż mogą one także logować się do dziennika zdarzeń systemu Windows).
Zdarzenia mogą mieć również powiązane liczniki wydajności (np. Liczbę błędów / s), i może być ważne koordynowanie dowolnego bezpośredniego zapisu do dziennika zdarzeń, liczników wydajności, zapisu do systemu śledzenia i raportowania do użytkownika, aby wystąpiły o o tym samym czasie.
tzn. jeśli użytkownik zobaczy komunikat o błędzie w określonym czasie, powinieneś być w stanie znaleźć ten sam komunikat o błędzie w Dzienniku zdarzeń systemu Windows, a następnie to samo zdarzenie z tym samym znacznikiem czasu w dzienniku śledzenia (wraz z innymi szczegółami śledzenia).
(2) Działania - pliki dziennika aplikacji lub tabela bazy danych (i pliki śledzenia)
Jest to regularna czynność wykonywana przez system, np. Obsługiwana strona internetowa, złożony handel giełdowy, przyjęte zamówienie, wykonane obliczenia itp.
Przydatne jest tutaj śledzenie aktywności (start, stop itp.) (Przy właściwej granulacji).
Ponadto bardzo często stosuje się konkretny dziennik aplikacji (czasami nazywany dziennikiem kontroli). Zwykle jest to tabela bazy danych lub plik dziennika aplikacji i zawiera ustrukturyzowane dane (tj. Zestaw pól).
Sprawy mogą się tu nieco rozmazać w zależności od aplikacji. Dobrym przykładem może być serwer WWW, który zapisuje każde żądanie w dzienniku internetowym; podobnymi przykładami może być system przesyłania komunikatów lub system obliczeń, w którym każda operacja jest rejestrowana wraz ze szczegółowymi danymi aplikacji.
Nie tak dobrym przykładem są transakcje giełdowe lub system zamówień sprzedaży. W tych systemach prawdopodobnie rejestrujesz już aktywność, ponieważ mają one ważną wartość biznesową, jednak zasada korelowania ich z innymi działaniami jest nadal ważna.
Oprócz niestandardowych dzienników aplikacji działania często mają również powiązane liczniki wydajności, np. Liczbę transakcji na sekundę.
Zasadniczo należy koordynować rejestrowanie działań w różnych systemach, tj. Zapisywać do dziennika aplikacji w tym samym czasie, gdy zwiększa się licznik wydajności i logować się do systemu śledzenia. Jeśli robisz to wszystko jednocześnie (lub bezpośrednio po sobie w kodzie), wówczas problemy z debugowaniem są łatwiejsze (niż jeśli wszystkie występują w różnych momentach / miejscach w kodzie).
(3) Śledzenie debugowania - plik tekstowy, a może XML lub baza danych.
Są to informacje na poziomie Verbose i niższym (np. Niestandardowe przełączniki boolean do włączania / wyłączania zrzutów surowych danych). Zapewnia to odwagę lub szczegóły tego, co robi system na poziomie poddziałania.
Jest to poziom, który chcesz włączyć / wyłączyć dla poszczególnych sekcji aplikacji (stąd wiele źródeł). Nie chcesz, aby te rzeczy zaśmiecały dziennik zdarzeń systemu Windows. Czasami używana jest baza danych, ale bardziej prawdopodobne są toczące się pliki dziennika, które są czyszczone po pewnym czasie.
Duża różnica między tymi informacjami a plikiem dziennika aplikacji polega na tym, że nie ma on struktury. Podczas gdy dziennik aplikacji może zawierać pola Do, Od, Kwota itp., Pełne ślady debugowania mogą być czymkolwiek, co programista wprowadza, np. „Sprawdzanie wartości X = {wartość}, Y = fałsz” lub losowe komentarze / znaczniki, takie jak „ Zrobiłem to, próbując ponownie ".
Jedną ważną praktyką jest upewnienie się, że rzeczy, które umieszczasz w plikach dziennika aplikacji lub Dzienniku zdarzeń systemu Windows, również są logowane do systemu śledzenia z tymi samymi szczegółami (np. Znacznik czasu). Pozwala to następnie skorelować różne dzienniki podczas badania.
Jeśli planujesz użyć konkretnej przeglądarki dziennika, ponieważ masz złożoną korelację, np. Service Trace Viewer, musisz użyć odpowiedniego formatu, np. XML. W przeciwnym razie zwykły plik tekstowy jest zwykle wystarczający - na niższych poziomach informacje są w dużej mierze nieustrukturyzowane, więc możesz znaleźć zrzuty tablic, zrzuty stosów itp. Pod warunkiem, że możesz skorelować się z bardziej uporządkowanymi dziennikami na wyższych poziomach, rzeczy powinny być w porządku.
P: Jeśli używasz plików, czy używasz dzienników kroczących, czy tylko jednego pliku? W jaki sposób udostępniasz dzienniki użytkownikom?
Odp .: W przypadku plików, na ogół chcesz przewijać pliki dziennika z punktu widzenia zarządzania (w System.Diagnostics wystarczy użyć VisualBasic.Logging.FileLogTraceListener).
Dostępność ponownie zależy od systemu. Jeśli mówisz tylko o plikach, to w przypadku serwera / usługi można uzyskać dostęp do plików w razie potrzeby. (Dziennik zdarzeń systemu Windows lub dzienniki aplikacji bazy danych miałyby własne mechanizmy dostępu).
Jeśli nie masz łatwego dostępu do systemu plików, śledzenie debugowania w bazie danych może być łatwiejsze. [tzn. zaimplementuj TraceListener bazy danych].
Jednym z ciekawych rozwiązań, jakie widziałem dla aplikacji GUI dla systemu Windows, było to, że rejestrował bardzo szczegółowe informacje o śledzeniu do „rejestratora lotu” podczas działania, a następnie, kiedy go wyłączałeś, jeśli nie miał problemów, po prostu usunął plik.
Jeśli jednak wystąpił błąd lub napotkał problem, plik nie został usunięty. Albo jeśli złapie błąd, albo przy następnym uruchomieniu zauważy plik, a następnie może podjąć działania, np. Skompresować go (np. 7zip) i wysłać pocztą e-mail lub w inny sposób udostępnić.
Wiele systemów obecnie obejmuje zautomatyzowane zgłaszanie awarii do centralnego serwera (po sprawdzeniu z użytkownikami, np. Ze względu na prywatność).
Przeglądanie
P: Jakich narzędzi używasz do przeglądania dzienników?
Odp .: Jeśli masz wiele dzienników z różnych powodów, będziesz używać wielu przeglądarek.
Notepad / vi / Notepad ++ lub jakikolwiek inny edytor tekstowy to podstawa dzienników zwykłego tekstu.
Jeśli masz skomplikowane operacje, np. Czynności związane z transferami, to oczywiście użyłbyś specjalistycznego narzędzia, takiego jak Service Trace Viewer. (Ale jeśli go nie potrzebujesz, edytor tekstu jest łatwiejszy).
Ponieważ generalnie loguję informacje wysokiego poziomu do Dziennika zdarzeń systemu Windows, zapewnia on szybki sposób uporządkowanego przeglądu (szukaj ładnych ikon błędów / ostrzeżeń). Musisz zacząć przeszukiwać pliki tekstowe tylko wtedy, gdy w dzienniku nie ma wystarczającej ilości, chociaż przynajmniej dziennik daje punkt wyjścia. (W tym momencie upewnianie się, że twoje logi są skoordynowane, staje się przydatne).
Ogólnie dziennik zdarzeń systemu Windows udostępnia te znaczące zdarzenia narzędziom monitorowania, takim jak MOM lub OpenView.
Inne -
Jeśli zalogujesz się do bazy danych, możesz łatwo filtrować i sortować informacje (np. Powiększyć konkretny identyfikator działania. (W plikach tekstowych możesz użyć Grep / PowerShell lub podobny do filtrowania na wybranym GUID)
MS Excel (lub inny program do obsługi arkuszy kalkulacyjnych). Może to być przydatne do analizowania informacji ustrukturyzowanych lub częściowo ustrukturyzowanych, jeśli można je zaimportować za pomocą odpowiednich separatorów, aby różne wartości trafiały do różnych kolumn.
Podczas uruchamiania usługi w trybie debugowania / testowania zwykle hostuję ją w aplikacji konsolowej dla uproszczenia Uważam, że przydatny jest kolorowy rejestrator konsoli (np. Czerwony w przypadku błędów, żółty w przypadku ostrzeżeń itp.). Musisz zaimplementować niestandardowy detektor śledzenia.
Zauważ, że framework nie zawiera kolorowego rejestratora konsoli ani rejestratora bazy danych, więc w tej chwili musisz je napisać, jeśli ich potrzebujesz (nie jest to zbyt trudne).
Naprawdę denerwuje mnie to, że kilka frameworków (log4net, EntLib itp.) Zmarnowało czas na ponowne wynalezienie koła i ponowne wdrożenie podstawowego rejestrowania, filtrowania i logowania do plików tekstowych, dziennika zdarzeń systemu Windows i plików XML, każdy we własnym zakresie inny sposób (instrukcje dziennika są różne w każdym); każdy z nich zaimplementował następnie własną wersję, na przykład, rejestratora bazy danych, gdy większość z nich już istniała i wystarczyło jeszcze kilka detektorów śledzenia dla System.Diagnostics. Mów o dużym marnowaniu podwójnego wysiłku.
P: Jeśli budujesz rozwiązanie ASP.NET, czy używasz również monitorowania kondycji ASP.NET? Czy dołączasz dane wyjściowe śledzenia do zdarzeń monitorowania kondycji? Co z Trace.axd?
Te rzeczy można włączyć / wyłączyć w razie potrzeby. Uważam, że Trace.axd jest dość użyteczny do debugowania reakcji serwera na pewne rzeczy, ale ogólnie nie jest użyteczny w silnie używanym środowisku lub do długoterminowego śledzenia.
P: Co z niestandardowymi licznikami wydajności?
W przypadku profesjonalnej aplikacji, zwłaszcza serwera / usługi, spodziewam się, że będzie ona w pełni wyposażona w liczniki Monitora wydajności i logowanie do Dziennika zdarzeń systemu Windows. Są to standardowe narzędzia w systemie Windows i powinny być używane.
Musisz upewnić się, że dołączasz instalatory używanych liczników wydajności i dzienników zdarzeń; należy je utworzyć podczas instalacji (podczas instalacji jako administrator). Gdy aplikacja działa normalnie, nie powinna mieć uprawnień administratora (a więc nie będzie w stanie tworzyć brakujących dzienników).
Jest to dobry powód, aby ćwiczyć programowanie jako użytkownik niebędący administratorem (należy mieć osobne konto administratora, gdy trzeba zainstalować usługi itp.). W przypadku zapisywania w dzienniku zdarzeń platforma .NET automatycznie utworzy brakujący dziennik przy pierwszym zapisywaniu; jeśli rozwijasz się jako nie-administrator, złapiesz to wcześnie i unikniesz nieprzyjemnej niespodzianki, gdy klient instaluje system, a następnie nie będzie mógł go użyć, ponieważ nie działa jako administrator.