【问题标题】:log4Net EventlogAppender does not work for Asp.Net 2.0 WebSite?log4Net EventlogAppender 不适用于 Asp.Net 2.0 网站?
【发布时间】:2011-02-04 23:00:18
【问题描述】:

我已经为 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 应用程序,它最终会起作用。

【问题讨论】:

标签: asp.net events .net-2.0 log4net log4net-configuration


【解决方案1】:

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

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

编辑:还可以直接查看该问题之后的问题,该问题解释了使用 EventLogAppender 的潜在挂起。

【解决方案2】:

我怀疑代码访问安全性会阻止您访问事件日志。 This article 有关于该主题的信息。基本上,如果您的 ASP.Net 应用程序在中等信任下运行,则该应用程序将无法访问事件日志。

注意:这不是 log4net 本身内置的限制,它是 .Net Framework 和 ASP.Net 的“功能”。

【讨论】:

    【解决方案3】:

    有一些非常简单的步骤可以让 Log4Net 使用 ASP.NET 处理事件日志。

    您的选择是:

    更改应用程序池

    以 LocalSystem 身份运行应用程序池

    或者...设置应用名称,添加注册表项

    首先配置你的配置文件所以有一个应用程序名称

    如果您遇到权限问题,这一点很重要,因为如果您 peer at the source 您会看到 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 位环境。

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

    【讨论】:

    • 对于 .NET 4+ 应用程序,路径是 C:\Windows\Microsoft.NET\Framework\v4.0.30319\EventLogMessages.dll
    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多