log4Net EventlogAppender не работает для Asp.Net 2.0 WebSite?
Я настроил log4Net EventLogAppender для Asp.Net 2.0. Однако это ничего не регистрирует. У меня есть следующие в моем Web.Config.
<log4net>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<param name="LogName" value="Test Log" />
<param name="ApplicationName" value="Test-Web" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<priority value="ERROR"/>
<appender-ref ref="EventLogAppender"/>
</root>
<logger name="NHibernate">
<level value="ERROR" />
<appender-ref ref="EventLogAppender" />
</logger>
</log4net>
Я уже создал журнал событий Test-Log, и у пользователя AspNet есть разрешение на запись в журнале событий. У меня также есть log4Net, настроенный в Global.asax Application_Start.
log4net.Config.XmlConfigurator.Configure();
Обновление: я включил внутреннюю отладку log4net и обнаружил следующую ошибку в трассировке.
log4net:ERROR XmlHierarchyConfigurator: Could not create Appender [EventLogAppender] of type [log4net.Appender.EventLogAppender]. Reported error follows.
System.Security.SecurityException: The source was not found, but some or all event logs could not be searched. Inaccessible logs: Security.
at System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly)
at System.Diagnostics.EventLog.SourceExists(String source, String machineName)
at System.Diagnostics.EventLog.SourceExists(String source)
at log4net.Appender.EventLogAppender.ActivateOptions()
at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement)
Обновление 2: наконец-то работает, если я создаю источник событий (Test-Web) с помощью консольного приложения в C#, а затем с помощью веб-приложения.
3 ответа
Я не могу точно сказать, что может быть не так, но если вы зайдете сюда, вы увидите "Как включить внутреннюю отладку log4net?" путь внизу. Log4net не будет генерировать исключения, если что-то не так, поэтому вы должны включить внутреннюю отладку, чтобы получить информацию из log4net.
http://logging.apache.org/log4net/release/faq.html
Редактировать: также смотрите квест сразу после того, который объясняет потенциальные зависания с использованием EventLogAppender.
Есть несколько очень простых шагов, чтобы заставить Log4Net работать с журналом событий с ASP.NET.
Ваши варианты:
Изменить пул приложений
Запустите пул приложений как LocalSystem
Или... установить имя приложения, добавить раздел реестра
Сначала настройте свой файл конфигурации, чтобы было имя приложения.
Это важно, если у вас есть проблема с разрешениями, потому что, если вы посмотрите на источник, вы увидите, что EventLogAppender по умолчанию задает имя приложения (столбец источника в журнале событий):
System.Threading.Thread.GetDomain (). FriendlyName
Это требует, чтобы ваше приложение создавало раздел реестра каждый раз, когда имя меняется, и это немного грязно. Поэтому лучшее решение - установить имя вашего приложения. Вот пример раздела EventLogAppender, который отправляет каждый уровень ошибки, строка ApplicationName является важной частью:
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<param name="ApplicationName" value="MY-AWESOME-APP" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="INFO" />
</evaluator>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO"/>
<param name="LevelMax" value="FATAL"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<!-- The event log already logs the date so just log the message -->
<conversionPattern value="%message" />
</layout>
</appender>
Перед внесением этого изменения сделайте следующее:
Создать раздел реестра
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application\MY-AWESOME-APP
Создайте строковое значение внутри этого
Назови это EventMessageFile
установите его значение
C:\Windows\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll
Этот путь работает как в 64-битной, так и в 32-битной среде.
С помощью этого метода вам не нужно устанавливать разрешения в реестре, и как только ключ выше будет создан, он должен просто работать.
Я подозреваю, что безопасность доступа к коду не позволяет вам получить доступ к журналу событий. В этой статье есть информация по теме. По сути, если ваше приложение ASP.Net работает со средним уровнем доверия, оно не будет иметь доступа к журналам событий.
Примечание: это не ограничение, встроенное в log4net как таковое, это "особенность".Net Framework и ASP.Net.