log4Net EventlogAppender не работает для Asp.Net 2.0 WebSite? - PullRequest
9 голосов
/ 06 апреля 2010

Я настроил 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 ]

11 голосов
/ 05 января 2011

Есть несколько очень простых шагов, чтобы заставить 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-битных средах.

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

4 голосов
/ 06 апреля 2010

Я не могу сказать вам точно, что может быть не так, но если вы зайдете сюда, вы увидите «Как включить внутреннюю отладку log4net?» путь внизу. Log4net не будет генерировать исключения, если что-то не так, поэтому вы должны включить внутреннюю отладку, чтобы получить информацию из log4net.

http://logging.apache.org/log4net/release/faq.html

Редактировать: Также смотрите квест сразу после того, который объясняет потенциальные зависания при использовании EventLogAppender.

2 голосов
/ 07 апреля 2010

Я подозреваю, что безопасность доступа к коду препятствует доступу к журналу событий. В этой статье есть информация по теме. По сути, если ваше приложение ASP.Net работает со средним уровнем доверия, оно не будет иметь доступа к журналам событий.

Примечание: это не ограничение, встроенное в log4net как таковое, это «особенность» .Net Framework и ASP.Net.

...