/// <summary> /// C#添加程序执行时长监控日志 /// </summary> public class StopwatchLog { static Task write; static List<string> Logs = new List<string>(); static StopwatchLog() { write = Task.Run(() => { while (true) { try { Thread.Sleep(2000); var logs = Logs; Logs = new List<string>(); string file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "timewatch.log"); File.AppendAllLines(file, logs); } catch { } } }); } /// <summary> /// 初始化请求 /// </summary> public static void Start() { HttpContext.Current.Items["request"] = DateTime.Now.ToUniversalTime().Ticks.ToString(); } /// <summary> /// 开始记录点 /// </summary> /// <returns></returns> public static Stopwatch StartLog() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); return stopwatch; } /// <summary> /// 结束记录点 /// </summary> /// <param name="stopwatch"></param> /// <param name="point"></param> public static void EndLog(Stopwatch stopwatch, string tag = "") { stopwatch.Stop(); //当前堆栈信息 StackTrace st = new StackTrace(); StackFrame[] sfs = st.GetFrames(); //过虑的方法名称,以下方法将不会出现在返回的方法调用列表中 string _filterdName = "ResponseWrite,ResponseWriteError,"; string _fullName = string.Empty; for (int i = 1; i < sfs.Length; ++i) { //非用户代码,系统方法及后面的都是系统调用,不获取用户代码调用结束 if (StackFrame.OFFSET_UNKNOWN == sfs[i].GetILOffset()) break; string _methodName = sfs[i].GetMethod().Name; if (_filterdName.Contains(_methodName)) continue; _fullName = _methodName + "-" + _fullName; } _fullName = string.IsNullOrEmpty(tag) ? _fullName.TrimEnd(‘-‘) : _fullName + tag; var request = Convert.ToString(HttpContext.Current.Items["request"]); var log = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")},{request},{_fullName},{stopwatch.ElapsedMilliseconds}"; Logs.Add(log); } }