W kilku aplikacjach naszej firmy korzystamy z niestandardowego rejestratora. Jest dość solidny, choć w przyszłości możemy go zastąpić czymś takim jak NLog. Jednym z zadań rejestratora jest rejestrowanie wyjątków napotkanych w aplikacji.
Jedną z moich obaw było to, że obsługa wyjątków w programie rejestrującym pozwala na cichą awarię. To znaczy, jeśli dziennik nie jest zapisany dla danego wyjątku (z powodu błędu w rejestratorze), jak mam go obsłużyć i (jakoś) zarejestrować wyjątek w samym rejestratorze ?
Powiedzmy, że funkcja WriteLog zgłasza wyjątek. Czy powinienem próbować wywoływać tę funkcję kilka razy, czy dopóki wyjątek nie zostanie zgłoszony? Czy powinienem spróbować zapisać zgłoszony wyjątek za pomocą programu rejestrującego (co prawdopodobnie doprowadziłoby do wyjątków od samego początku ...)? Miałem szczęście, że nie spotkałem się z tą sytuacją, z wyjątkiem pierwszego wdrożenia niestandardowego programu rejestrującego. Z drugiej strony nie mam obecnie możliwości dowiedzieć się, czy program rejestrujący nie zarejestrował wyjątków aplikacji (z powodu własnych wyjątków).
Próbowałem wyszukiwać online i na niektórych stronach SE, ale do tej pory było to bezowocne, ponieważ wszystkie posty dotyczą błędów w rejestratorze (ale nie potencjalnych wyjątków i sposobu ich rejestrowania) lub wyjątków poza rejestratorem.
stderr
że Twój nośnik wyjściowy zawiódł lub że stało się „niemożliwe”.Odpowiedzi:
W przypadku napotkania wyjątków w samym rejestratorze nie należy używać rejestratora do rejestrowania własnych wyjątków. Powodem tego jest to, że:
Możesz utknąć w nieskończonej pętli. Wyobraź sobie, że w twoim loggerze masz gałąź warunkową, która nie została przetestowana (i generuje wyjątek). Wyobraź sobie, że po spełnieniu warunku, każdy kolejny zgłoszony wyjątek jest obsługiwany przez ten sam oddział. Oznacza to, że od momentu wykonania gałęzi jesteś w nieskończonej pętli.
Możesz utknąć w tymczasowej pętli, generując tysiące wyjątków na sekundę. Wyobraź sobie, że zgłaszasz wyjątki na zdalnym serwerze. Problem z serwerem powoduje kolejny wyjątek, który powoduje kolejny itd., Dopóki połączenie nie zostanie przywrócone.
Zamiast tego powinieneś wrócić do bezpieczniejszego sposobu rejestrowania wyjątków. Na przykład, jeśli program rejestrujący wysyła wyjątki do zdalnego serwera,
syslog
zamiast tego wyślij wyjątki w programie rejestrującym . Jeśli program rejestrujący rejestruje wyjątki w zdarzeniach systemu Windows, a to działanie kończy się niepowodzeniem, zapisz wyjątek niepowodzenia w prostym pliku tekstowym.Gdy już to zrobisz, następne pytanie brzmi: skąd wiesz, że wystąpiły te wyjątki: jeśli masz dziesiątki aplikacji działających na tysiącach serwerów, nie możesz SSH każdej z nich regularnie, aby sprawdzić, czy logują się one lokalnie .
Jednym ze sposobów jest posiadanie zadania cron, które sprawdza te „wyjątkowe dzienniki” i wypycha je do miejsca, w którym przechowywane są inne wyjątki (ewentualnie przy użyciu rejestratora, ale uważaj na nieskończone lub tymczasowe pętle!).
źródło
Jeśli rejestrowanie ma krytyczne znaczenie dla aplikacji, należy zatrzymać aplikację, jeśli rejestracja się nie powiedzie.
Jeśli nie jest to krytyczne, to będąc nieco defensywnym, można mieć dodatkowy komponent do obsługi błędów rejestrowania, które rejestrują / alarmują do dodatkowego źródła. Ale nawet to nie jest głupi dowód i będziesz musiał rozważyć, co się stanie, jeśli drugi rejestrator zawiedzie podczas monitorowania głównego rejestratora.
Dobrą strategią jest logowanie do pliku lokalnego, a jeśli to się nie powiedzie, być może rejestrowanie tego niepowodzenia w dzienniku zdarzeń, generowanie powiadomienia e-mail, zapisywanie w bazie danych itp. Przy dostępnych ramach rejestrowania powinno to być niezawodne, chyba że maszyna uruchomi się brak miejsca na dysku lub inny rzadki stan.
Najlepiej byłoby, gdybyś po cichu zawiódł, ponieważ spowoduje to, że aplikacja będzie mniej złożona.
Co ważniejsze, w celu obsługi błędów rejestrowania należy monitorować dzienniki od strony trzeciej. Z czasem powinieneś być w stanie rozpoznać, ile zdarzeń rejestruje zdrowa aplikacja. Jeśli zacznie rejestrować niski poziom lub nie będzie żadnych zdarzeń, wówczas poprzez monitorowanie możesz zobaczyć występujący problem i potencjalnie zaalarmować przez ten mechanizm innej firmy.
źródło