• C#添加程序执行时长监控日志


    /// <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
  • 相关阅读:
    全链路压测(4):全链路压测的价值是什么?
    基于SVN的版本范围汇总
    一篇值得思考的职业教育之路!
    分享35个讨人喜欢的漂亮进度条UI设计
    转一篇难得的好文章CPU流水线的探秘之旅
    超棒的获奖动物摄影作品集
    解决web.py在SAE云中的Session使用问题
    2012年度最新免费web开发设计资源荟萃
    Endless icon: 每天都更新的图标集
    不容错过的超棒Javascript日期处理类库Moment.js
  • 原文地址:https://www.cnblogs.com/chenyinxin/p/15033159.html
Copyright © 2020-2023  润新知