namespace Demo.Web.Logging { using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.SharePoint.Administration; using System.Diagnostics.Eventing; using System.Runtime.InteropServices; using System.Security.AccessControl; using System.Security.Principal; using System.Threading; using System.Diagnostics; public class LogManager { public static void Write(Exception ex, SPDiagnosticsCategory category, TraceSeverity severity) { if (ex.Data != null && !ex.Data.Contains("CallingFunction")) { ex.Data.Add("CallingFunction", System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.Name); } Dictionary<string, object> props = null; if (ex.Data != null && ex.Data.Count > 0) { props = new Dictionary<string, object>(); foreach (string key in ex.Data) { props.Add(key, ex.Data[key]); } } LoggingService.Log(ex.ToString(), props); } public static void Write(string message, Dictionary<string, object> props) { LoggingService.Log(message, props); } public static void Write(string message, Dictionary<string, object> props, TraceSeverity severity) { LoggingService.Log(message, props, severity); } public static void Write(string message, Dictionary<string, object> props, TraceSeverity severity, string categoryName) { LoggingService.Log(message, props, severity, categoryName); } public static void Write(string message, Dictionary<string, object> props, TraceSeverity severity, SPDiagnosticsCategory category) { //SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("My Category", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, ex.Message, ex.StackTrace); LoggingService.Log(message, props, severity, category); } } #region [ Internal ULS Access Implementation ] internal class LoggingService : SPDiagnosticsServiceBase { public static string DemoDiagnosticAreaName = "Demo"; private static LoggingService _Current; public static LoggingService Current { get { if (_Current == null) { _Current = new LoggingService(); } return _Current; } } private LoggingService() : base("Demo Logging Service", SPFarm.Local) { } protected override IEnumerable<spdiagnosticsarea> ProvideAreas() { List<spdiagnosticsarea> areas = new List<spdiagnosticsarea> { new SPDiagnosticsArea(DemoDiagnosticAreaName, new List<spdiagnosticscategory> { new SPDiagnosticsCategory("Application", TraceSeverity.Unexpected, EventSeverity.Error), new SPDiagnosticsCategory("WebService", TraceSeverity.Unexpected, EventSeverity.Error), new SPDiagnosticsCategory("WebConfigMod", TraceSeverity.Unexpected, EventSeverity.Error) }) }; return areas; } public static void Log(string message) { Log(message, null); } public static void Log(string message, Dictionary<string, object> props) { Log(message, props, TraceSeverity.Unexpected); } public static void Log(string message, Dictionary<string, object> props, TraceSeverity severity) { Log(message, props, TraceSeverity.Unexpected, "Application"); } public static void Log(string message, Dictionary<string, object> props, TraceSeverity severity, string categoryName) { SPDiagnosticsCategory category = LoggingService.Current.Areas[DemoDiagnosticAreaName].Categories[categoryName]; Log(message, props, severity, category); } public static void Log(string message, Dictionary<string, object> props, TraceSeverity severity, SPDiagnosticsCategory category) { if (props == null) { props = new Dictionary<string, object>(); } if (!props.ContainsKey("CallingFunction")) { props.Add("CallingFunction", (new StackTrace()).GetFrame(1).GetMethod().Name); } string propSerial = "{" + string.Join(",", props.Select( d => string.Format("\"{0}\":\"{1}\"", d.Key, d.Value.ToString()) ).ToArray()) + "}"; //SPDiagnosticsCategory category = LoggingService.Current.Areas[DemoDiagnosticAreaName].Categories[categoryName]; LoggingService.Current.WriteTrace(0, category, TraceSeverity.Unexpected, message + " ~ Properties: " + propSerial); } } #endregion } }
Monday, February 20, 2012
Log Manager With Extra Information Using SharePoint 2010 Unified Logging Service
Here is a wrapper class which covers the SharePoint ULS interface and logs information to the ULS. I attempted to add as much information as I could and allow for a property dictionary to be appended to the log entry.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment