воскресенье, января 28, 2007

Проблемы с EventLog в ASPNET

Хорошая идея использовать Windows Event Log для логирования сообщений в своем ASPNET приложении. Пишем:


Sysyem.Diagnostics.EventLog.WriteEntry("MyApplication", "Something happened");


Однако в большинстве случаев эта строка вылетит с ошибкой


"Requested registry access is not allowed"


Происходит это потому, что ASPNET код обычно исполняется из под учетной записи с ограниченными правами (ASPNET на IIS 5.0 и Network Service на IIS 6.0), а при вызове EventLog.WriteEntry происходит обращение к реестру. В реестре перечислены все источники (csource) для Event Log (в нашем случае это строка "MyApplication"). У класса EventLog существует специальный метод для создания источника EventLog.CreateEventSourc. Однако в нашем случае он не поможет. Прав нет.
Соответствующий ключ реестра можно прописать ручками:


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MyApplication


Программно, источники Event Log-а создаются при помощи специального класса инсталлятора System.Diagnostics.EventLogInstaller. Для этого надо создать отдельную сборку поместить в нее код инсталлера:


using System;
using System.Configuration.Install;
using System.Diagnostics;
using System.ComponentModel;

[RunInstaller(true)]
public class CustomEventLogInstaller: Installer
{
private EventLogInstaller customEventLogInstaller;
public CustomEventLogInstaller()
{
// создаем экземпляр EventLogInstaller
customEventLogInstaller = new EventLogInstaller();
// Устанавливаем свойство 'Source' (собственно ради чего весь сыр бор)
customEventLogInstaller.Source = "MyApplication";
// В какой лог писать (обычно Application)
customEventLogInstaller.Log = "Application";
// Добавляем myEventLogInstaller в коллекцию инсталлеров.
Installers.Add(customEventLogInstaller);
}
public static void Main()
{
}
}


Получившуюся сборку можно использовать двумя способами. Первый, скормить ее утилите installutil.exe


InstallUtil.exe <путь>\сборка_инсталлера.dll


Второй, эту сборку можно использовать в инсталяторе web приложения. Для этого ее надо включить в setup проект и назначить для всех четырех Custom Actions (Install, Commit, Rollback, Uninstall).
Да, и не забудьте настроить в свойствах Application Event Log - "Затирать по необходимости". Иначе очень скоро работа вашего приложения окажется парализована из-за постоянных ошибок о преполнении лога сообщений.

1 комментарий:

Анонимный комментирует...

О, чудо! Это помогает и с WinService! Спасибо!