log4Net EventlogAppender不适用于Asp.Net 2.0 WebSite?

Ami*_*abh 9 asp.net events log4net .net-2.0 log4net-configuration

我为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>
Run Code Online (Sandbox Code Playgroud)

我已经创建了测试日志事件日志,并且AspNet用户对事件日志注册表项具有权限.我还在Global.asax Application_Start中配置了log4Net.

log4net.Config.XmlConfigurator.Configure();
Run Code Online (Sandbox Code Playgroud)

更新:我打开了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)
Run Code Online (Sandbox Code Playgroud)

更新2:如果我在c#中使用基于控制台的应用程序创建事件源(Test-Web)然后使用Web应用程序,它最终会起作用.

Chr*_*s S 11

有一些非常简单的步骤可以让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>
Run Code Online (Sandbox Code Playgroud)

在进行此更改之前,请执行以下操作:

创建一个注册表项

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application\MY-AWESOME-APP

在此内部创建一个字符串值

命名它EventMessageFile,将其值设置为

C:\ WINDOWS\Microsoft.NET \框架\ V2.0.50727\EventLogMessages.dll

该路径似乎适用于64位和32位环境.

使用此技术,您无需在注册表中设置权限,并且一旦创建了上面的密钥,它就可以正常工作.

  • 对于.NET 4+应用程序,路径为C:\ Windows\Microsoft.NET\Framework\v4.0.30319\EventLogMessages.dll (2认同)

Aar*_*nLS 4

我无法确切地告诉您可能出了什么问题,但是如果您转到此处,您将看到“如何启用 log4net 内部调试?” 一直到底部。如果出现错误,Log4net 不会抛出异常,因此您必须启用内部调试才能从 log4net 获取信息。

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

编辑:另请参阅紧接着该问题之后的问题,该问题解释了使用 EventLogAppender 时可能出现的问题。

  • [直接链接到上述部分](http://logging.apache.org/log4net/release/faq.html#internalDebug) (2认同)