Próbuję używać ELMAH do rejestrowania błędów w mojej aplikacji ASP.NET MVC, jednak kiedy używam atrybutu [HandleError] na moich kontrolerach, ELMAH nie rejestruje żadnych błędów, kiedy one wystąpią.
Zgaduję, ponieważ ELMAH rejestruje tylko nieobsługiwane błędy, a atrybut [HandleError] obsługuje błąd, więc nie trzeba go rejestrować.
Jak zmodyfikować lub jak zmienić modyfikację atrybutu, aby ELMAH mógł wiedzieć, że wystąpił błąd i go zarejestrować.
Edycja: pozwól mi upewnić się, że wszyscy rozumieją, wiem, że mogę zmodyfikować atrybut, który nie jest pytaniem, które zadaję ... ELMAH zostaje pominięty podczas używania atrybutu handleerror, co oznacza, że nie zobaczy, że wystąpił błąd, ponieważ został obsłużony już za pomocą atrybutu ... Pytam, czy istnieje sposób, aby ELMAH zobaczył błąd i zarejestrował go, mimo że atrybut go obsłużył ... Rozejrzałem się dookoła i nie widzę żadnych metod wywoływania w celu wymuszenia zalogowania błąd....
źródło
Odpowiedzi:
Możesz podklasować
HandleErrorAttribute
i zastępować jegoOnException
element członkowski (bez potrzeby kopiowania), aby rejestrował wyjątek w ELMAH i tylko wtedy, gdy podstawowa implementacja go obsługuje. Minimalna ilość potrzebnego kodu jest następująca:Najpierw wywoływana jest implementacja podstawowa, co daje szansę na oznaczenie wyjątku jako obsługiwanego. Dopiero wtedy sygnalizowany jest wyjątek. Powyższy kod jest prosty i może powodować problemy, jeśli jest używany w środowisku, w którym
HttpContext
może nie być dostępny, na przykład podczas testowania. W rezultacie będziesz potrzebować bardziej defensywnego kodu (kosztem nieco dłuższego):Ta druga wersja najpierw spróbuje użyć sygnalizacji błędów z ELMAH, która obejmuje w pełni skonfigurowany potok, taki jak rejestrowanie, wysyłanie pocztą, filtrowanie i co masz. W przeciwnym razie próbuje sprawdzić, czy błąd powinien zostać przefiltrowany. Jeśli nie, błąd jest po prostu rejestrowany. Ta implementacja nie obsługuje powiadomień pocztowych. Jeśli można zasygnalizować wyjątek, wiadomość zostanie wysłana, jeśli jest skonfigurowana do tego.
Być może trzeba będzie zadbać o to, aby w przypadku
HandleErrorAttribute
wystąpienia wielu instancji zduplikowane rejestrowanie nie wystąpiło, ale powyższe dwa przykłady powinny zacząć.źródło
Przepraszam, ale myślę, że zaakceptowana odpowiedź to przesada. Wszystko, co musisz zrobić, to:
a następnie zarejestruj go (ważna jest kolejność) w Global.asax.cs:
źródło
HandleErrorAttribute
, nie ma potrzeby, aby zastąpićOnException
naBaseController
. Przypuszcza to przyjętą odpowiedź.new UnhandledLoggedException(Exception thrown)
który dołącza cośMessage
przedElmahHandledErrorLoggerFilter()
Elmah po prostu rejestruje nieobsługiwane błędy, ale nie jest obsługiwany. Zarejestrowałem filtry we właściwej kolejności, jak wspomniałeś, jakieś myśli?W NuGet jest teraz pakiet ELMAH.MVC, który zawiera ulepszone rozwiązanie firmy Atif, a także kontroler, który obsługuje interfejs elmah w ramach routingu MVC (nie trzeba już używać tego axd)
. Problem z tym rozwiązaniem (i wszystkimi tymi tutaj ) jest to, że w ten czy inny sposób moduł obsługi błędów Elmah faktycznie obsługuje błąd, ignorując to, co możesz ustawić jako niestandardowy tagError lub za pośrednictwem narzędzia ErrorHandler lub własnego programu obsługi błędów
Najlepszym rozwiązaniem IMHO jest utworzenie filtra, który będzie działał na końcu wszystkich innych filtrów i rejestrował zdarzenia, które zostały już obsłużone. Moduł elmah powinien zająć się rejestrowaniem innych błędów, które nie są obsługiwane przez aplikację. Umożliwi to również użycie monitora kondycji i wszystkich innych modułów, które można dodać do asp.net w celu sprawdzenia zdarzeń błędów
Napisałem to patrząc z odbłyśnikiem na ErrorHandler wewnątrz elmah.mvc
Teraz w konfiguracji filtra chcesz zrobić coś takiego:
Zauważ, że zostawiłem tam komentarz, aby przypomnieć ludziom, że jeśli chcą dodać filtr globalny, który faktycznie obsłuży wyjątek, powinien przejść PRZED tym ostatnim filtrem, w przeciwnym razie natrafisz na przypadek, w którym nieobsługiwany wyjątek zostanie zignorowany przez filtr ElmahMVCError, ponieważ nie został obsłużony i powinien zostać zarejestrowany przez moduł Elmah, ale następnie następny filtr oznacza wyjątek jako obsłużony, a moduł go ignoruje, co powoduje, że wyjątek nigdy nie przekształca się w elmah.
Teraz upewnij się, że ustawienia elmah w konfiguracji sieciowej wyglądają mniej więcej tak:
Ważnym tutaj jest „elmah.mvc.disableHandleErrorFilter”, jeśli jest to fałsz, użyje on modułu obsługi w elmah.mvc, który faktycznie obsłuży wyjątek, używając domyślnego HandleErrorHandler, który zignoruje twoje ustawienia customError
Ta konfiguracja pozwala ustawić własne tagi ErrorHandler w klasach i widokach, jednocześnie rejestrując te błędy za pomocą ElmahMVCErrorFilter, dodając konfigurację customError do pliku web.config za pośrednictwem modułu elmah, a nawet pisząc własne programy obsługi błędów. Jedyne, co musisz zrobić, to pamiętać, aby nie dodawać żadnych filtrów, które faktycznie obsługiwałyby błąd przed napisanym przez nas filtrem elmah. I zapomniałem wspomnieć: nie ma duplikatów w elmie.
źródło
Możesz wziąć powyższy kod i pójść o krok dalej, wprowadzając niestandardową fabrykę kontrolera, która wstrzykuje atrybut HandleErrorWithElmah do każdego kontrolera.
Aby uzyskać więcej informacji, sprawdź moją serię blogów na temat logowania do MVC. Pierwszy artykuł obejmuje konfigurację Elmah i uruchomienie dla MVC.
Na końcu artykułu znajduje się link do kodu do pobrania. Mam nadzieję, że to pomaga.
http://dotnetdarren.wordpress.com/
źródło
Jestem nowy w ASP.NET MVC. Napotkałem ten sam problem, poniższe informacje są dostępne w moim pliku Erorr.vbhtml (działa, jeśli potrzebujesz tylko zalogować błąd przy użyciu dziennika Elmah)
To jest po prostu!
źródło
Całkowicie alternatywnym rozwiązaniem jest nieużywanie MVC
HandleErrorAttribute
, a zamiast tego poleganie na obsłudze błędów ASP.Net, z którą Elmah ma współpracować.Musisz usunąć domyślny globalny
HandleErrorAttribute
z App_Start \ FilterConfig (lub Global.asax), a następnie skonfigurować stronę błędu w pliku Web.config:Uwaga: może to być adres URL przekierowany przez MVC, więc powyższe przekieruje do
ErrorController.Index
akcji, gdy wystąpi błąd.źródło
Dla mnie bardzo ważne było, aby rejestrowanie wiadomości e-mail działało. Po pewnym czasie odkryłem, że w przykładzie Atif potrzeba tylko 2 wierszy kodu.
Mam nadzieję, że to komuś pomoże :)
źródło
Właśnie tego potrzebowałem do konfiguracji mojej witryny MVC!
Dodałem małą modyfikację
OnException
metody do obsługi wieluHandleErrorAttribute
instancji, zgodnie z sugestią Atif Aziz:Po prostu sprawdzam
context.ExceptionHandled
przed wywołaniem klasy podstawowej, aby wiedzieć, czy ktoś inny obsłużył wyjątek przed bieżącym modułem obsługi.Działa dla mnie i wysyłam kod na wypadek, gdyby ktoś go potrzebował, i pytam, czy ktoś wie, czy coś przeoczyłem.
Mam nadzieję, że jest to przydatne:
źródło