public void PopulateLogEntryForCallHandler(IMethodInvocation input, //List<string> categories, //bool includeParameters, bool includeCallStack, IMethodReturn result, long? tracingStartTicks, long? tracingEndTicks, long elapsedMilliseconds, string messageFormat, string moduleId, string functionId, ComponentType component) { MonitoringLogEntry logEntry = PopulateDefaultLogEntry(); using (BackgroundWorker worker = new BackgroundWorker()) { worker.DoWork += delegate(object oDoWork, DoWorkEventArgs eDoWork) { try { AppContext.SetToCallContext(AppContext.Current.ToDictionary()); CategoryFormatter formatter = new CategoryFormatter(input.MethodBase); logEntry = eDoWork.Argument as MonitoringLogEntry; //foreach (string category in categories) //{ // logEntry.Categories.Add(formatter.FormatCategory(category)); //} logEntry.Categories.Add(formatter.FormatCategory(LoggingCategories.Monitoring)); logEntry.Component = component; if (!Logger.ShouldLog(logEntry)) { return; } //When do the instrumentation log , we should log the parameter values information, otherwise not if ((logEntry.Flag & FilterFlag.InstrumentationFlag) == FilterFlag.InstrumentationFlag) { //if (includeParameters) { logEntry.ParameterValues = GenerateValuesInfo(input.Arguments, true); } } //if (includeCallStack) //{ // logEntry.CallStack = Environment.StackTrace; //} logEntry.TypeName = input.Target.GetType().FullName; logEntry.MethodName = string.Concat(input.MethodBase.DeclaringType.FullName, ".", input.MethodBase.Name); if (result == null) { PopulatePreLogEntry(logEntry); } else { PopulatePostLogEntry(logEntry); if ((logEntry.Flag & FilterFlag.InstrumentationFlag) == FilterFlag.InstrumentationFlag) { int depth = 0; object returnedValue = result.ReturnValue; logEntry.ReturnValue = GenerateValueInfo("ReturnValue", returnedValue, (returnedValue == null) ? null : returnedValue.GetType(), ref depth); } } logEntry.TracingStartTicks = tracingStartTicks; logEntry.TracingEndTicks = tracingEndTicks; logEntry.SecondsElapsed = GetSecondsElapsed(elapsedMilliseconds); logEntry.Message = string.Format(Resources.Culture, messageFormat, logEntry.ExtendedActivityId, logEntry.MethodName, logEntry.TracingEndTicks, logEntry.SecondsElapsed); logEntry.FunctionId = functionId; logEntry.ModuleId = moduleId; //if (result.ReturnValue != null && includeParameters) //{ // logEntry.ReturnValue = result.ReturnValue.ToString(); //} if (result != null && result.Exception != null) { logEntry.Exception = result.Exception.ToString(); } LogWriter logWriter = Logger.Writer; logWriter.Write(logEntry); } catch (Exception ex) { //Swallow exception, because it is logging should not impact the business function HiiPLoggingExceptionHandler handler = new HiiPLoggingExceptionHandler("Server Exception", 100, TraceEventType.Error, "Instrumtation logging of RowUpdated failed", 0, typeof(HiiPLoggingExceptionFormatter), ComponentType.StoredProcedure, Logger.Writer); handler.HandleException(ex, Guid.NewGuid()); } }; worker.RunWorkerAsync(logEntry); } }
public void PopulateLogEntryStoredProcedure(long? tracingStartTicks, long? tracingEndTicks, long elapsedMilliseconds, string executionMethod, string messageFormat, string moduleId, string functionId, EventArgs e) { LogWriter logWriter = Logger.Writer; if (!logWriter.IsTracingEnabled()) { return; } MonitoringLogEntry logEntry = PopulateDefaultLogEntry(); using (BackgroundWorker worker = new BackgroundWorker()) { RowUpdatedEventArgs updatedEvent = e as RowUpdatedEventArgs; string[] rows = new string[0]; if (updatedEvent != null) { if (updatedEvent.StatementType == StatementType.Batch && updatedEvent.RowCount > 0) { rows = new string[updatedEvent.RowCount]; DataRow[] tempRows ; tempRows = new DataRow[updatedEvent.RowCount]; updatedEvent.CopyToRows(tempRows); for (int i = 0; i < tempRows.Length; i++) { DataRow row = tempRows[i]; StringBuilder batchBuilder = new StringBuilder(); BuildRowInfo(batchBuilder, row); rows[i] = batchBuilder.ToString(); } } else if (updatedEvent.Row != null) { rows = new string[1]; StringBuilder builder = new StringBuilder(); BuildRowInfo(builder, updatedEvent.Row); rows[0] = builder.ToString(); } } else { RowUpdatingEventArgs updatingEvent = e as RowUpdatingEventArgs; if (updatingEvent != null) { rows = new string[1]; StringBuilder builder = new StringBuilder(); BuildRowInfo(builder, updatingEvent.Row); rows[0] = builder.ToString(); } } worker.DoWork += delegate(object oDoWork, DoWorkEventArgs eDoWork) { try { AppContext.SetToCallContext(AppContext.Current.ToDictionary()); logEntry = eDoWork.Argument as MonitoringLogEntry; logEntry.Component = ComponentType.StoredProcedure; logEntry.FunctionId = functionId; logEntry.ModuleId = moduleId; //logEntry.Categories.Add("Trace"); //TODO: modified by xiaofeng. Should here hardcode the category? Can it be re-used by exception logging and security logging? logEntry.Categories.Add(LoggingCategories.Monitoring); if (!Logger.ShouldLog(logEntry)) { return; } logEntry.TracingStartTicks = tracingStartTicks; logEntry.TracingEndTicks = tracingEndTicks; logEntry.SecondsElapsed = GetSecondsElapsed(elapsedMilliseconds); logEntry.MethodName = executionMethod; logEntry.Message = string.Format(Resources.Culture, messageFormat, logEntry.ExtendedActivityId, logEntry.MethodName, logEntry.TracingEndTicks, logEntry.SecondsElapsed); PopulateStoredProcedueDetail(logEntry, e, rows); } catch (Exception ex) { //Swallow exception, because it is logging should not impact the business function HiiPLoggingExceptionHandler handler = new HiiPLoggingExceptionHandler("Server Exception", 100, TraceEventType.Error, "Instrumtation logging of RowUpdated failed", 0, typeof(HiiPLoggingExceptionFormatter), ComponentType.StoredProcedure, Logger.Writer); handler.HandleException(ex, Guid.NewGuid()); } }; worker.RunWorkerAsync(logEntry); } }