Author: bodewig
Date: Mon Sep 12 10:37:30 2011
New Revision: 1169681

URL: http://svn.apache.org/viewvc?rev=1169681&view=rev
Log:
Deal with SecurityException in EventLogAppender more gracefully.  LOG4NET-310

Modified:
    logging/log4net/trunk/src/Appender/EventLogAppender.cs
    logging/log4net/trunk/tests/src/Appender/EventLogAppenderTest.cs

Modified: logging/log4net/trunk/src/Appender/EventLogAppender.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/Appender/EventLogAppender.cs?rev=1169681&r1=1169680&r2=1169681&view=diff
==============================================================================
--- logging/log4net/trunk/src/Appender/EventLogAppender.cs (original)
+++ logging/log4net/trunk/src/Appender/EventLogAppender.cs Mon Sep 12 10:37:30 
2011
@@ -233,60 +233,60 @@ namespace log4net.Appender
                /// </remarks>
                override public void ActivateOptions() 
                {
-                       base.ActivateOptions();
+            try {
+                base.ActivateOptions();
 
-                       if (m_securityContext == null)
-                       {
-                               m_securityContext = 
SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
-                       }
-
-                       bool sourceAlreadyExists = false;
-                       string currentLogName = null;
-
-                       using(SecurityContext.Impersonate(this))
-                       {
-                               sourceAlreadyExists = 
EventLog.SourceExists(m_applicationName);
-                               if (sourceAlreadyExists)
-                               {
-                                       currentLogName = 
EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
-                               }
-                       }
-
-                       if (sourceAlreadyExists && currentLogName != m_logName)
-                       {
-                               LogLog.Debug(declaringType, "Changing event 
source [" + m_applicationName + "] from log [" + currentLogName + "] to log [" 
+ m_logName + "]");
-                       }
-                       else if (!sourceAlreadyExists)
-                       {
-                               LogLog.Debug(declaringType, "Creating event 
source Source [" + m_applicationName + "] in log " + m_logName + "]");
-                       }
-
-                       string registeredLogName = null;
-
-                       using(SecurityContext.Impersonate(this))
-                       {
-                               if (sourceAlreadyExists && currentLogName != 
m_logName)
-                               {
-                                       //
-                                       // Re-register this to the current 
application if the user has changed
-                                       // the application / logfile association
-                                       //
-                                       
EventLog.DeleteEventSource(m_applicationName, m_machineName);
-                                       CreateEventSource(m_applicationName, 
m_logName, m_machineName);
-
-                                       registeredLogName = 
EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
-                               }
-                               else if (!sourceAlreadyExists)
-                               {
-                                       CreateEventSource(m_applicationName, 
m_logName, m_machineName);
-
-                                       registeredLogName = 
EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
-                               }
-                       }
-
-                       m_levelMapping.ActivateOptions();
-
-                       LogLog.Debug(declaringType, "Source [" + 
m_applicationName + "] is registered to log [" + registeredLogName + "]");      
       
+                if (m_securityContext == null) {
+                    m_securityContext = 
SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
+                }
+
+                bool sourceAlreadyExists = false;
+                string currentLogName = null;
+
+                using (SecurityContext.Impersonate(this)) {
+                    sourceAlreadyExists = 
EventLog.SourceExists(m_applicationName);
+                    if (sourceAlreadyExists) {
+                        currentLogName = 
EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
+                    }
+                }
+
+                if (sourceAlreadyExists && currentLogName != m_logName) {
+                    LogLog.Debug(declaringType, "Changing event source [" + 
m_applicationName + "] from log [" + currentLogName + "] to log [" + m_logName 
+ "]");
+                }
+                else if (!sourceAlreadyExists) {
+                    LogLog.Debug(declaringType, "Creating event source Source 
[" + m_applicationName + "] in log " + m_logName + "]");
+                }
+
+                string registeredLogName = null;
+
+                using (SecurityContext.Impersonate(this)) {
+                    if (sourceAlreadyExists && currentLogName != m_logName) {
+                        //
+                        // Re-register this to the current application if the 
user has changed
+                        // the application / logfile association
+                        //
+                        EventLog.DeleteEventSource(m_applicationName, 
m_machineName);
+                        CreateEventSource(m_applicationName, m_logName, 
m_machineName);
+
+                        registeredLogName = 
EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
+                    }
+                    else if (!sourceAlreadyExists) {
+                        CreateEventSource(m_applicationName, m_logName, 
m_machineName);
+
+                        registeredLogName = 
EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
+                    }
+                }
+
+                m_levelMapping.ActivateOptions();
+
+                LogLog.Debug(declaringType, "Source [" + m_applicationName + 
"] is registered to log [" + registeredLogName + "]");
+            }
+            catch (System.Security.SecurityException ex) {
+                ErrorHandler.Error("Caught a SecurityException trying to 
access the EventLog.  Most likely the event source "
+                    + m_applicationName
+                    + " doesn't exist and must be created by a local 
administrator.  Will disable EventLogAppender", ex);
+                Threshold = Level.Off;
+            }
                }
 
                #endregion // Implementation of IOptionHandler

Modified: logging/log4net/trunk/tests/src/Appender/EventLogAppenderTest.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/tests/src/Appender/EventLogAppenderTest.cs?rev=1169681&r1=1169680&r2=1169681&view=diff
==============================================================================
--- logging/log4net/trunk/tests/src/Appender/EventLogAppenderTest.cs (original)
+++ logging/log4net/trunk/tests/src/Appender/EventLogAppenderTest.cs Mon Sep 12 
10:37:30 2011
@@ -40,9 +40,10 @@ namespace log4net.Tests.Appender
                /// event log enumeration is returned
                /// </summary>
                [Test]
-               public void TestGetEntryType()
+               public void TestGetEntryTypeForExistingApplicationName()
                {
                        EventLogAppender eventAppender = new EventLogAppender();
+            eventAppender.ApplicationName = "Winlogon";
                        eventAppender.ActivateOptions();
 
                        Assert.AreEqual(
@@ -74,6 +75,18 @@ namespace log4net.Tests.Appender
                                GetEntryType(eventAppender, Level.Off));
                }
 
+        /// <summary>
+        /// ActivateOption tries to create an event source if it doesn't exist 
but this is going to fail on more modern Windows versions unless the code is 
run with local administrator privileges.
+        /// </summary>
+        [Test]
+        [Platform(Exclude = "Win2K,WinXP")]
+        public void ActivateOptionsDisablesAppenderIfSourceDoesntExist()
+        {
+            EventLogAppender eventAppender = new EventLogAppender();
+            eventAppender.ActivateOptions();
+            Assert.AreEqual(Level.Off, eventAppender.Threshold);
+        }
+
                //
                // Helper functions to dig into the appender
                //
@@ -82,5 +95,6 @@ namespace log4net.Tests.Appender
                {
                        return (EventLogEntryType)Utils.InvokeMethod(appender, 
"GetEntryType", level);
                }
+
        }
 }
\ No newline at end of file


Reply via email to