log4Net EventlogAppender does not work for Asp.Net 2.0 WebSite?

I have configured log4Net EventLogAppender for Asp.Net 2.0. However it does not log anything. I have following in my 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>

I already have Test-Log Event Log created and AspNet user has permission on the Event Log registry entry. I also have log4Net configured in Global.asax Application_Start.

log4net.Config.XmlConfigurator.Configure();

Update : I switched on the log4net internal debugging and found the following error in the 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)

Update 2 : It finally works if I create the Event Source (Test-Web) using a console based application in c# and then using the Web Application.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

There’s some very simple steps to get Log4Net working with the event log with ASP.NET.

Your options are:

Change the app pool

Run the application pool as LocalSystem

Or…set an application name, add a registry key

Configure your config file first so there is an application name.

This is important if you are having a permissions issue, because if you peer at the source you’ll see the EventLogAppender defaults the application name (the source column in the event log) to:

System.Threading.Thread.GetDomain().FriendlyName

This requires your application to create a registry key each time the name changes, and is a bit messy. So the best solution is to set your application name. Here’s an example EventLogAppender section that sends every error level, the ApplicationName line is the important part:

<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>

Before making this change, do the following:

Create a registry key

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetserviceseventlogApplicationMY-AWESOME-APP

Create a string value inside this

Name it EventMessageFile, set its value to

C:WindowsMicrosoft.NETFrameworkv2.0.50727EventLogMessages.dll

That path appears to work in both 64 bit and 32 bit environments.

With this technique you don’t need to set permissions in the registry, and once the key above is created it should just work.

Method 2

I can’t tell you exactly what might be wrong, but if you go here you will see “How do I enable log4net internal debugging?” way down at the bottom. Log4net will not throw exceptions if something is wrong, so you must enable internal debugging in order to get information from log4net.

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

Edit: Also see the quesiton directly after that one that explains potential hangups with using the EventLogAppender.

Method 3

I would suspect code access security is preventing you from accessing the event log. This article have information on the topic. Basically, if your ASP.Net application is running under medium trust the app will not have access to event logs.

Note: this is not a restriction built into log4net per se, it is a “feature” of the .Net Framework and ASP.Net.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x