/// <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);
}
}
.NET Core 2.0 开源框架BitAdminCore作者。
框架演示:http://bit.bitdao.cn
框架使用:https://github.com/chenyinxin/cookiecutter-bitadmin-core
框架交流:QQ群202426919