我为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内部调试,发现跟踪中出现以下错误。
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应用程序,它最终会起作用。
答案 0 :(得分:11)
有一些非常简单的步骤可以让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 \框架\ V2.0.50727 \ EventLogMessages.dll
该路径似乎适用于64位和32位环境。
使用这种技术,您不需要在注册表中设置权限,一旦创建了上面的密钥,它就可以正常工作。
答案 1 :(得分:4)
我无法确切地告诉您可能出现的问题,但是如果你到这里,你会看到“如何启用log4net内部调试?”在底部的方式。如果出现问题,Log4net不会抛出异常,因此您必须启用内部调试才能从log4net获取信息。
http://logging.apache.org/log4net/release/faq.html
编辑:也可以在使用EventLogAppender解释潜在挂断的问题之后直接看问题。
答案 2 :(得分:2)
我怀疑代码访问安全性会阻止您访问事件日志。 This article有关于该主题的信息。基本上,如果您的ASP.Net应用程序在中等信任下运行,则应用程序将无法访问事件日志。
注意:这不是log4net本身内置的限制,它是.Net Framework和ASP.Net的“功能”。