Asp.net

log4Net EventlogAppender 不適用於 Asp.Net 2.0 網站?

  • January 20, 2013

我已經為 Asp.Net 2.0 配置了 log4Net EventLogAppender。但是,它不會記錄任何內容。我的 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>

我已經創建了測試日誌事件日誌,並且 AspNet 使用者對事件日誌系統資料庫項具有權限。我還在 Global.asax Application_Start 中配置了 log4Net。

log4net.Config.XmlConfigurator.Configure();

更新:我打開log4net內部調試,在trace中發現如下錯誤。

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:如果我在 c# 中使用基於控制台的應用程序創建事件源(Test-Web),然後使用 Web 應用程序,它最終會起作用。

我不能確切地告訴你可能出了什麼問題,但是如果你去這裡你會看到“我如何啟用 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 位環境。

使用這種技術,您無需在系統資料庫中設置權限,一旦創建了上面的密鑰,它就應該可以工作。

引用自:https://stackoverflow.com/questions/2587453