Obsługa błędów za pomocą modułu ELMAH

Do zapisywania błędów występujących w aplikacjach serwery IIS Webio mają domyślnie zainstalowany moduł ich logowania o nazwie ELMAH (http://code.google.com/p/elmah/) skompilowany w innej niż domyślna przestrzeni nazw (WebioElmah), po to aby nie zakłócać pracy biblioteki Elmah instalowanej przez użytkowników we własnym zakresie. Poniższy opis przedstawia w jaki sposób należy uaktualnić plik web.config, aby włączyć logowanie błędów do plików XML lub bazy danych SQLite. Moduł ten należy włączać tylko na czas jego używania.
 
 
 
 
W sekcji System kliknąć Menadżer plików.
 
 
W katalogu głównym witryny, utworzyć katalog App_Data. Kliknąć ikonę kłódki przy katalogu.
 
 
Nadać uprawnienia Zapisu dla aplikacji do katalogu i obiektów podrzędnych. Kliknąć Ustaw uprawnienia.
 
 
Uaktualnić plik web.config. Jego domyślna zawartość wygląda następująco (po utworzeniu nowej witryny):
 
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="false" />
        <defaultDocument>
            <files>
                <clear />
                <add value="Default.aspx" />
                <add value="index.html" />
                <add value="index.htm" />
                <add value="index.php" />
                <add value="Default.htm" />
                <add value="Default.asp" />
                <add value="index.asp" />
                <add value="WebioDefault.aspx" />
            </files>
        </defaultDocument>
        <httpErrors errorMode="Detailed" existingResponse="PassThrough" />
    </system.webServer>
</configuration>
 
Dodajemy nowe sekcje i uzupełniamy już istniejące poniższym kodem. Na tym etapie należy wybrać metodę logowania błędów. W przypadku logowania błędów do bazy danych, dodać również sekcję <connectionStrings>. Trzy kropki w kodzie "..." oznaczają pozostałą część pliku web.config.
 
...
<configuration>
   
    <configSections>
        <sectionGroup name="webioelmah">
            <section name="security" requirePermission="false"
            type="WebioElmah.SecuritySectionHandler, WebioElmah,
            Version=1.1.11517.0,Culture=neutral, PublicKeyToken=93297c12d98e0131
" />
 
            <section name="errorLog" requirePermission="false"
            type="WebioElmah.ErrorLogSectionHandler, WebioElmah,
            Version=1.1.11517.0,Culture=neutral, PublicKeyToken=93297c12d98e0131
" />
        </sectionGroup>
    </configSections>
   
    <webioelmah>
        <security allowRemoteAccess="yes" />
        <!-- NALEŻY WYBRAĆ JEDEN Z PONIŻSZYCH WPISÓW ODPOWIEDZIALNYCH
        ZA TYP LOGOWANIA BŁĘDÓW:
-->
       
        <!-- WPIS DLA LOGOWANIA BŁĘDÓW DO PLIKÓW XML:-->
        <errorLog type="WebioElmah.XmlFileErrorLog, WebioElmah,
        Version=1.1.11517.0,Culture=neutral, PublicKeyToken=93297c12d98e0131
"
        logPath="~/App_Data" />  

        <!-- WPIS DLA LOGOWANIA BŁĘDÓW DO BAZY DANYCH SQLite:-->
        <errorLog type="WebioElmah.SQLiteErrorLog, WebioElmah,
        Version=1.1.11517.0,Culture=neutral, PublicKeyToken=93297c12d98e0131
"
        connectionStringName="WebioElmah.SQLite" />
    </webioelmah>
       
    <connectionStrings>
        <!-- WPIS TEN DODAĆ TYLKO, JEŚLI BŁĘDY BĘDĄ ZAPISYWANE W BAZIE DANYCH -->
        <add name="WebioElmah.SQLite" connectionString=
        "Data Source=~/App_Data/errors.s3db" />
    </connectionStrings>
  
    <system.web>
        <httpHandlers>
            <add verb="POST,GET,HEAD" path="WebioElmah.axd"
            type="WebioElmah.ErrorLogPageFactory, WebioElmah, Version=1.1.11517.0,
            Culture=neutral, PublicKeyToken=93297c12d98e0131
" />
        </httpHandlers>
        <httpModules>
            <add name="ErrorLog" type="WebioElmah.ErrorLogModule, WebioElmah,
            Version=1.1.11517.0, Culture=neutral, PublicKeyToken=93297c12d98e0131
" />
        </httpModules>
    </system.web>
   
    <system.webServer>
    ...
        <validation validateIntegratedModeConfiguration="false" />
        <handlers>
        <!-- W PRZYPADKU GDY APLIKACJA WYKORZYSTUJE .NET FRAMEWORK 2.0,
        NALEŻY UAKTUALNIĆ WARTOŚĆ Z
runtimeVersionv4.0 NA runtimeVersionv2.0-->
            <add name="WebioElmah.axd_POST,GET,HEAD" path="WebioElmah.axd"
            verb="POST,GET,HEAD" type="WebioElmah.ErrorLogPageFactory, WebioElmah,
            Version=1.1.11517.0, Culture=neutral,PublicKeyToken=93297c12d98e0131
"
            preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
        <modules>
            <add name="ErrorLog" type="WebioElmah.ErrorLogModule, WebioElmah,
            Version=1.1.11517.0, Culture=neutral, PublicKeyToken=93297c12d98e0131
"
            preCondition="managedHandler" />
        </modules>
    ...
    </system.webServer>
</configuration>
 
W przypadku aplikacji MVC w pliku Globals.asax.cs należy usunąć lub zakomentować linię kodu:
 
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// filters.Add(new HandleErrorAttribute());
}
 
Plik web.config nie może zawierać błędów składniowych. W naszym przypadku błędy będą zapisywane do plików XML. Po dodaniu powyższego kodu, zawartość pliku web.configprzedstawia się następująco:
 
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <configSections>
        <sectionGroup name="webioelmah">
            <section name="security" requirePermission="false"
            type="WebioElmah.SecuritySectionHandler, WebioElmah,
            Version=1.1.11517.0,Culture=neutral, PublicKeyToken=93297c12d98e0131
" />
 
            <section name="errorLog" requirePermission="false"
            type="WebioElmah.ErrorLogSectionHandler, WebioElmah,
            Version=1.1.11517.0,Culture=neutral, PublicKeyToken=93297c12d98e0131
" />
        </sectionGroup>
    </configSections>
   
    <webioelmah>
        <security allowRemoteAccess="yes" />
        <errorLog type="WebioElmah.XmlFileErrorLog, WebioElmah,
        Version=1.1.11517.0,Culture=neutral, PublicKeyToken=93297c12d98e0131
"
        logPath="~/App_Data" />  

    </webioelmah>
    <system.web>
        <httpHandlers>
            <add verb="POST,GET,HEAD" path="WebioElmah.axd"
            type="WebioElmah.ErrorLogPageFactory, WebioElmah, Version=1.1.11517.0,
            Culture=neutral, PublicKeyToken=93297c12d98e0131
" />
        </httpHandlers>
        <httpModules>
            <add name="ErrorLog" type="WebioElmah.ErrorLogModule, WebioElmah,
            Version=1.1.11517.0, Culture=neutral, PublicKeyToken=93297c12d98e0131
" />
        </httpModules>
    </system.web>   
    <system.webServer>
        <directoryBrowse enabled="false" />
        <defaultDocument>
            <files>
                <clear />
                <add value="Default.aspx" />
                <add value="index.html" />
                <add value="index.htm" />
                <add value="index.php" />
                <add value="Default.htm" />
                <add value="Default.asp" />
                <add value="index.asp" />
                <add value="WebioDefault.aspx" />
            </files>
        </defaultDocument>
        <validation validateIntegratedModeConfiguration="false" />
        <handlers>
            <add name="WebioElmah.axd_POST,GET,HEAD" path="WebioElmah.axd"
            verb="POST,GET,HEAD" type="WebioElmah.ErrorLogPageFactory, WebioElmah,
            Version=1.1.11517.0, Culture=neutral,PublicKeyToken=93297c12d98e0131
"
            preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
        <modules>
            <add name="ErrorLog" type="WebioElmah.ErrorLogModule, WebioElmah,
            Version=1.1.11517.0, Culture=neutral, PublicKeyToken=93297c12d98e0131
"
            preCondition="managedHandler" />
        </modules>
        <httpErrors errorMode="Detailed" existingResponse="PassThrough" />
    </system.webServer>
</configuration>
 
 
Następnie należy sprawdzić działanie modułu. Wpisać w przeglądarce adres:
http://DOMENAWITRYNY/WebioElmah.axd
Wyświetlenie się poniższej strony z logiem błędów (niezależnie czy błędy wystąpiły, czy też nie) oznacza, że ELMAH działa poprawnie.



Jeśli w aplikacji wystąpią błędy, zostaną one wyświetlone oraz zapisane do osobnych plików XML w katalogu App_Data. Aby sprawdzić ich szczegóły należy kliknąć Details.

Błędy


 
 
 Aby uniemożliwić podgląd z logiem błędów należy zmienic wartość w istniejącej konfiguracji:
 
<security allowRemoteAccess="no" />
 

Jeśli aplikacja jest napisana w ASP.NET MVC należy dodać do pliku Global.asax ścieżkę do ignorowania:
 
routes.IgnoreRoute("WebioElmah.axd");
 
Po zakończeniu korzystania z modułu wyłączamy go. Pozostawienie go włączonego na dłuższy czas może spowodować wygenerowanie wiele plików XML, co skutecznie może spowolnić działanie witryny.
 
  • ASP.NET
  • 89 Klienci ocenili te informacje jako pomocne
Czy ta informacja była pomocna?

Podobne

Włączenie pokazywania błędów aplikacji napisanych w PHP i ASP Classic

Aby mieć możliwość podejrzenia błędów generowanych przez PHP należy uaktualnić plik...

'Sys' is undefined

W większości przypadków gdy witryna generuje błąd "'Sys' is undefined" mamy do...

Znak dwukropka (":") powoduje błąd Bad Request

Do pliku web.config (niezależnie czy jest to aplikacja PHP czy ASP.NET) należy dodać wpis:...

Uruchomienie usługi WCF oraz błąd Memory gates checking failed because the free memory (..... bytes) is less than 5% of total memory

Aby uruchomic usługę WCF na serwerach Webio oraz uniknąć problemów z pamięcią podczas...