Czy można wykonać następujące czynności przy użyciu ELMAH?
logger.Log(" something");
Robię coś takiego:
try
{
// Code that might throw an exception
}
catch(Exception ex)
{
// I need to log error here...
}
Ten wyjątek nie zostanie automatycznie zarejestrowany przez ELMAH, ponieważ został obsłużony.
Odpowiedzi:
Metoda bezpośredniego zapisu dziennika, działająca od ELMAH 1.0:
ELMAH 1.2 wprowadza bardziej elastyczny interfejs API:
Istnieje różnica między tymi dwoma rozwiązaniami:
Raise
Metoda stosuje reguły filtrowania ELMAH do wyjątku.Log
metoda nie.Raise
jest oparty na subskrypcji i może zalogować jeden wyjątek do kilku rejestratorów.źródło
Elmah.ErrorLog.Log()
: rzuca na wypadek, gdyby samo wywołanie dziennika nie powiodło się, prawdopodobnie powodując uszkodzenie całej aplikacji internetowej.Raise()
zawodzi cicho. Na przykład: jeśli wystąpi problem z błędną konfiguracją po stronie serwera (np. Elmah jest skonfigurowany do zapisywania błędów na dysku, ale nie ma prawidłowego dostępu do folderu logów),.Log()
metoda wyrzuci. (Jest to przydatne do debugowania, np. Dlaczego nic nie.Raise()
loguje?)Poleciłbym zawinięcie połączenia do Elmah w swoją własną prostą klasę opakowania.
Następnie wystarczy zadzwonić, gdy trzeba zarejestrować błąd.
Ma to następujące zalety:
Uwaga: Dodałem właściwość „contextualMessage” dla informacji kontekstowych. Możesz to pominąć, jeśli wolisz, ale uważam to za bardzo przydatne. Elmah automatycznie rozpakowuje wyjątki, więc bazowy wyjątek będzie nadal zgłaszany w dzienniku, ale komunikat kontekstowy będzie widoczny po kliknięciu.
źródło
// uh oh! just keep going
. Jeśli moja obsługa błędów kończy się niepowodzeniem, chcę wiedzieć. Chcę, żeby trochę hałasowało.Za pomocą metody Elmah.ErrorSignal () można zarejestrować problem bez zgłaszania wyjątku.
źródło
źródło
Tak to mozliwe. ELMAH został zaprojektowany do przechwytywania nieobsługiwanych wyjątków. Możesz jednak zasygnalizować wyjątek ELMAH za pośrednictwem klasy ErrorSignal. Te wyjątki nie są zgłaszane (nie wygasają), ale są wysyłane tylko do ELMAH (i do subskrybentów zdarzenia Raise klasy ErrorSignal).
Mały przykład:
źródło
Chciałem zrobić to samo w wątku, w którym zacząłem umieszczać w kolejce pocztę z poziomu aplikacji MVC4, ponieważ nie miałem dostępnego HttpContext po zgłoszeniu wyjątku. Aby to zrobić, skończyłem z następującymi na podstawie tego pytania i kolejnej odpowiedzi tutaj: elmah: wyjątki bez HttpContext?
W pliku konfiguracyjnym podałem nazwę aplikacji:
Następnie w kodzie (jak odpowiedź podana powyżej, ale bez HttpContext) możesz podać null zamiast HttpContext:
źródło
packages.config
wyglądasz? Czy widzisz coś takiego<package id="elmah" version="1.2.2" targetFramework="net45" />
<package id="elmah.corelibrary" version="1.2.2" targetFramework="net45" />
<package id="elmah.sqlserver" version="1.2" targetFramework="net45" />'
:? Czy zainstalowałeś z NuGET?packages.config
Czasami
CurrentHttpContext
może nie być dostępna.Definiować
Posługiwać się
źródło
Jestem na rdzeniu ASP.NET i używam ElmahCore .
Aby ręcznie rejestrować błędy za pomocą HttpContext (w kontrolerze), po prostu napisz:
W innej części aplikacji bez HttpContext :
źródło
Próbowałem zapisywać niestandardowe komunikaty w dziennikach elmah za pomocą Signal.FromCurrentContext (). Raise (ex); i stwierdził, że te wyjątki są propagowane, np .:
Poza tym nie widzę, jak elmah obsługuje różne poziomy rejestrowania - czy można wyłączyć pełne rejestrowanie za pomocą ustawienia web.config?
źródło
Użyłem tej linii i działa idealnie dobrze.
źródło