Author: bodewig
Date: Mon Sep 12 11:58:00 2011
New Revision: 1169705
URL: http://svn.apache.org/viewvc?rev=1169705&view=rev
Log:
Allow EventLog category to be specified via the LoggingEvent's properties or a
configured value. Based on patch by Ron Grabowsky. LOG4NET-38
Modified:
logging/log4net/trunk/src/Appender/EventLogAppender.cs
logging/log4net/trunk/src/Util/SystemInfo.cs
Modified: logging/log4net/trunk/src/Appender/EventLogAppender.cs
URL:
http://svn.apache.org/viewvc/logging/log4net/trunk/src/Appender/EventLogAppender.cs?rev=1169705&r1=1169704&r2=1169705&view=diff
==============================================================================
--- logging/log4net/trunk/src/Appender/EventLogAppender.cs (original)
+++ logging/log4net/trunk/src/Appender/EventLogAppender.cs Mon Sep 12 11:58:00
2011
@@ -47,6 +47,11 @@ namespace log4net.Appender
/// set using the <c>EventID</c> property (<see
cref="LoggingEvent.Properties"/>)
/// on the <see cref="LoggingEvent"/>.
/// </para>
+ /// <para>
+ /// The <c>Category</c> of the event log entry can be
+ /// set using the <c>Category</c> property (<see
cref="LoggingEvent.Properties"/>)
+ /// on the <see cref="LoggingEvent"/>.
+ /// </para>
/// <para>
/// There is a limit of 32K characters for an event log message
/// </para>
@@ -231,7 +236,24 @@ namespace log4net.Appender
set { m_eventId = value; }
}
- #endregion // Public Instance Properties
+
+ /// <summary>
+ /// Gets or sets the <c>Category</c> to use unless one is explicitly
specified via the <c>LoggingEvent</c>'s properties.
+ /// </summary>
+ /// <remarks>
+ /// <para>
+ /// The <c>Category</c> of the event log entry will normally be
+ /// set using the <c>Category</c> property (<see
cref="LoggingEvent.Properties"/>)
+ /// on the <see cref="LoggingEvent"/>.
+ /// This property provides the fallback value which defaults to 0.
+ /// </para>
+ /// </remarks>
+ public short Category
+ {
+ get { return m_category; }
+ set { m_category = value; }
+ }
+ #endregion // Public Instance Properties
#region Implementation of IOptionHandler
@@ -355,7 +377,7 @@ namespace log4net.Appender
//
int eventID = m_eventId;
- // Look for the EventLogEventID property
+ // Look for the EventID property
object eventIDPropertyObj =
loggingEvent.LookupProperty("EventID");
if (eventIDPropertyObj != null)
{
@@ -386,6 +408,38 @@ namespace log4net.Appender
}
}
+ short category = m_category;
+ // Look for the Category property
+ object categoryPropertyObj =
loggingEvent.LookupProperty("Category");
+ if (categoryPropertyObj != null)
+ {
+ if (categoryPropertyObj is short)
+ {
+ category = (short) categoryPropertyObj;
+ }
+ else
+ {
+ string categoryPropertyString = categoryPropertyObj as
string;
+ if (categoryPropertyString == null)
+ {
+ categoryPropertyString =
categoryPropertyObj.ToString();
+ }
+ if (categoryPropertyString != null &&
categoryPropertyString.Length > 0)
+ {
+ // Read the string property into a number
+ short shortVal;
+ if (SystemInfo.TryParse(categoryPropertyString, out
shortVal))
+ {
+ category = shortVal;
+ }
+ else
+ {
+ ErrorHandler.Error("Unable to parse event category
property [" + categoryPropertyString + "].");
+ }
+ }
+ }
+ }
+
// Write to the event log
try
{
@@ -401,7 +455,7 @@ namespace log4net.Appender
using(SecurityContext.Impersonate(this))
{
- EventLog.WriteEntry(m_applicationName,
eventTxt, entryType, eventID);
+ EventLog.WriteEntry(m_applicationName,
eventTxt, entryType, eventID, category);
}
}
catch(Exception ex)
@@ -500,7 +554,12 @@ namespace log4net.Appender
/// </summary>
private int m_eventId = 0;
- #endregion // Private Instance Fields
+ /// <summary>
+ /// The event category to use unless one is explicitly specified via
the <c>LoggingEvent</c>'s properties.
+ /// </summary>
+ private short m_category = 0;
+
+ #endregion // Private Instance Fields
#region Level2EventLogEntryType LevelMapping Entry
Modified: logging/log4net/trunk/src/Util/SystemInfo.cs
URL:
http://svn.apache.org/viewvc/logging/log4net/trunk/src/Util/SystemInfo.cs?rev=1169705&r1=1169704&r2=1169705&view=diff
==============================================================================
--- logging/log4net/trunk/src/Util/SystemInfo.cs (original)
+++ logging/log4net/trunk/src/Util/SystemInfo.cs Mon Sep 12 11:58:00 2011
@@ -835,7 +835,55 @@ namespace log4net.Util
#endif
}
- /// <summary>
+ /// <summary>
+ /// Parse a string into an <see cref="Int16"/> value
+ /// </summary>
+ /// <param name="s">the string to parse</param>
+ /// <param name="val">out param where the parsed value is
placed</param>
+ /// <returns><c>true</c> if the string was able to be parsed into an
integer</returns>
+ /// <remarks>
+ /// <para>
+ /// Attempts to parse the string into an integer. If the string cannot
+ /// be parsed then this method returns <c>false</c>. The method does
not throw an exception.
+ /// </para>
+ /// </remarks>
+ public static bool TryParse(string s, out short val)
+ {
+#if NETCF
+ val = 0;
+ try
+ {
+ val = short.Parse(s,
System.Globalization.NumberStyles.Integer,
System.Globalization.CultureInfo.InvariantCulture);
+ return true;
+ }
+ catch
+ {
+ }
+
+ return false;
+#else
+ // Initialise out param
+ val = 0;
+
+ try
+ {
+ double doubleVal;
+ if (Double.TryParse(s,
System.Globalization.NumberStyles.Integer,
System.Globalization.CultureInfo.InvariantCulture, out doubleVal))
+ {
+ val = Convert.ToInt16(doubleVal);
+ return true;
+ }
+ }
+ catch
+ {
+ // Ignore exception, just return false
+ }
+
+ return false;
+#endif
+ }
+
+ /// <summary>
/// Lookup an application setting
/// </summary>
/// <param name="key">the application settings key to
lookup</param>