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.
Zalogować się do Panelu zarządzania kontem hostingowym.
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>
<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" />
<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>
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>
type="WebioElmah.ErrorLogPageFactory, WebioElmah, Version=1.1.11517.0,
Culture=neutral, PublicKeyToken=93297c12d98e0131" />
</httpHandlers>
<add name="ErrorLog" type="WebioElmah.ErrorLogModule, WebioElmah,
Version=1.1.11517.0, Culture=neutral, PublicKeyToken=93297c12d98e0131" />
</httpModules>
</system.web>
Version=1.1.11517.0, Culture=neutral, PublicKeyToken=93297c12d98e0131" />
</httpModules>
...
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<!-- W PRZYPADKU GDY APLIKACJA WYKORZYSTUJE .NET FRAMEWORK 2.0,
NALEŻY UAKTUALNIĆ WARTOŚĆ Z runtimeVersionv4.0 NA runtimeVersionv2.0-->
<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>
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>
</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:
Jeśli aplikacja jest napisana w ASP.NET MVC należy dodać do pliku Global.asax ścieżkę do ignorowania:
<?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" />
<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>
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>
type="WebioElmah.ErrorLogPageFactory, WebioElmah, Version=1.1.11517.0,
Culture=neutral, PublicKeyToken=93297c12d98e0131" />
</httpHandlers>
<add name="ErrorLog" type="WebioElmah.ErrorLogModule, WebioElmah,
Version=1.1.11517.0, Culture=neutral, PublicKeyToken=93297c12d98e0131" />
</httpModules>
</system.web> Version=1.1.11517.0, Culture=neutral, PublicKeyToken=93297c12d98e0131" />
</httpModules>
<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>
<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>
<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.
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.
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.