zoukankan      html  css  js  c++  java
  • 日志帮助类

    从网上找了些资源,借鉴整理之后,自己随便写了一个。

        public class LogHelper
        {
            #region 构造函数、析构函数、单一实体
    
            private LogHelper() 
            {
                _threadWriteLog = new Thread(new ThreadStart(WriteLog));
                _threadWriteLog.Start();
            }
    
            ~LogHelper()
            {
                if (_threadWriteLog != null)
                {
                    _threadWriteLog.Abort();
                    _threadWriteLog = null;
                }
            }
    
            private static LogHelper logHelper;
            private static readonly object sysRoot = new object();
            /// <summary>
            /// 日志类的单一实体
            /// </summary>
            public static LogHelper LogHelperSingle
            {
                get
                {
                    if (logHelper == null)
                    {
                        lock (sysRoot)
                        {
                            if (logHelper == null)
                            {
                                logHelper = new LogHelper();
                            }
                        }
                    }
                    return logHelper;
                }
            }
    
            #endregion
    
            #region 属性
    
            private string _path = string.Empty;
            /// <summary>
            /// 日志路径
            /// </summary>
            public string LogPath
            {
                set { this._path = value; }
                get
                {
                    if (string.IsNullOrEmpty(this._path))
                    {
                        this._path = string.Format("{0}\Log", Application.StartupPath);
                    }
                    return this._path;
                }
            }
    
            private string _logName;
            /// <summary>
            /// 日志名称
            /// </summary>
            public string LogName
            {
                set { this._logName = value; }
                get
                {
                    if (string.IsNullOrEmpty(this._logName))
                    {
                        DateTime t = DateTime.Now;
                        this._logName = string.Format("{0}{1}{2}.txt", t.Year, t.Month, t.Day);
                    }
                    return this._logName;
                }
            }
            /// <summary>
            /// 日志信息
            /// </summary>
            private List<string[]> _logInfo = new List<string[]>();
            /// <summary>
            /// 写日志线程
            /// </summary>
            Thread _threadWriteLog = null;
    
            #endregion
    
            #region 对外方法
    
            /// <summary>
            /// 写日志
            /// </summary>
            /// <param name="exc">错误</param>
            /// <param name="fileName">try...catch 所在页面</param>
            public void WriteErrorLog(Exception exc, string fileName)
            {
                string[] log = GetErrorLogInfo(exc, fileName);
                this._logInfo.Add(log);
            }
    
            /// <summary>
            /// 记录常规日志
            /// </summary>
            /// <param name="message">日志信息</param>
            public void WriteRoutineLog(string message)
            {
                string[] log = GetRoutineLog(message);
                this._logInfo.Add(log);
            }
    
            #endregion
    
            #region 对内方法
    
            /// <summary>
            /// 记录日志
            /// </summary>
            private void WriteLog()
            {
                while (true)
                {
                    Thread.Sleep(200);
                    if (_logInfo.Count > 0)
                    {
                        string[] info = _logInfo[0];
                        WriteLog(info, this.LogPath, this.LogName);
                        this._logInfo.RemoveAt(0);             
                    }
                }
            }
    
            /// <summary>
            /// 得到异常信息的字符串数组
            /// </summary>
            /// <param name="exc">异常对象</param>
            /// <returns>字符串数组</returns>
            private string[] GetErrorLogInfo(Exception exc, string fileName)
            {
                string[] info = new string[7];
                info[0] = string.Format("记录时间:{0}", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
                info[1] = string.Format("异常实例:{0}", exc.InnerException != null ? exc.InnerException.ToString() : string.Empty);
                info[2] = string.Format("try..catch所在页面:{0}", fileName);
                info[3] = string.Format("引发异常的方法:{0}", exc.TargetSite.ToString());
                info[4] = string.Format("导致错误的应用程序或对象的名称:{0}", exc.Source);
                info[5] = string.Format("错误信息:{0}", exc.Message);
                info[6] = string.Empty;
                return info;
            }
    
            /// <summary>
            /// 得到常规日志记录
            /// </summary>
            /// <param name="message">日志信息</param>
            private string[] GetRoutineLog(string message)
            {
                string[] log = new string[3];
                log[0] = string.Format("记录时间:{0}", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
                log[1] = string.Format("记录信息:{0}", message);
                log[2] = string.Empty;
                return log;
            }
    
            /// <summary>
            /// 记录日志
            /// </summary>
            /// <param name="log">日志信息</param>
            /// <param name="path">日志路径</param>
            /// <param name="logName">日志名称</param>
            private void WriteLog(string[] log, string path, string logName)
            {
                string fullName = string.Format(@"{0}{1}", path.TrimEnd('\'), logName);
                if (!File.Exists(fullName))
                {
                    if (!Directory.Exists(path))
                    {
                        Directory.CreateDirectory(path);
                    }
                    using (FileStream fs = new FileStream(fullName, FileMode.Create))
                    {
                        using (StreamWriter sw = new StreamWriter(fs))
                        {
                            for (int i = 0; i < log.Length; i++)
                            {
                                sw.WriteLine(log[i]);
                            }
                        }
                    }
                }
                else
                {
                    using (FileStream fs = new FileStream(fullName, FileMode.Append))
                    {
                        using (StreamWriter sw = new StreamWriter(fs))
                        {
                            for (int i = 0; i < log.Length; i++)
                            {
                                sw.WriteLine(log[i]);
                            }
                        }
                    }
                }
            }
    
            #endregion
        }
  • 相关阅读:
    Item 16: 让const成员函数做到线程安全
    学习张鑫旭大神元素抛物线运动插件
    js根据浏览器对css3移动的支持,选择元素移动方式
    如何在图片加载完成前获取到图片宽高
    JavaScript和SVG实现点击连线
    多层级叠加问题
    闭包应用
    展示触摸屏网页打包成桌面应用(nw.js)
    获取鼠标坐标
    常用文档
  • 原文地址:https://www.cnblogs.com/rogation/p/3419055.html
Copyright © 2011-2022 走看看