public void TraceLeave(string methodInfo, long startTicks, long endTicks, string[] paramNames, object[] paramValues) { string returnValue = null; if (paramNames != null) { StringBuilder parameters = new StringBuilder(); for (int i = 0; i < paramNames.Length; i++) { if (paramNames[i] == "$exception") { var value = paramValues[i].ToString(); paramValues[i] = value; } parameters.AppendFormat("{0}={1}", paramNames[i] ?? "$return", paramValues[i] == null ? NullString : paramValues[i].ToString() .Replace("\r\n", string.Empty) .Replace("\"", string.Empty) .Replace(@"\", @"/")); if (i < paramNames.Length - 1) { parameters.Append(", "); } } returnValue = parameters.ToString(); } double timeTaken = ConvertTicksToMilliseconds(endTicks - startTicks); string message = String.Empty; if (TracerContext.Tracer == null) { message = String.Format(_textReturn, methodInfo, returnValue, timeTaken); } else { message = String.Format(_textReturnWithTracer, methodInfo, returnValue, timeTaken, TracerContext.Tracer.TracerId, TracerContext.Tracer.SpanId); } Log.Info(message); TracerContext.Leave(); }