asp.net c# 异步日志通用类(1)

来源:互联网 发布:郝斌老师c语言笔记 编辑:程序博客网 时间:2024/05/21 06:39

简单写一个日志通用操作类的优化过程,最简单的版本到使用队列实现的版本,示例1 代码如下:


/********************************************* * CLR 版本:       4.0.30319.42000 * 类 名 称:       Logger * 机器名称:       MS-20170310FLQY * 命名空间:       Utils * 文 件 名:       Logger * 创建时间:       2017/5/12 10:16:17 * 作    者:       Choj * 说    明:      * 修改时间: * 修 改 人: * *********************************************/using System;using System.Collections.Generic;using System.Configuration;using System.IO;using System.Linq;using System.Runtime.Remoting.Messaging;using System.Text;using System.Threading;using System.Threading.Tasks;namespace Utils{    /// <summary>    /// 异步日志实现类    /// </summary>    public class Logger    {        #region 属性        /// <summary>        /// 实例化        /// </summary>        public static Logger Instance = new Logger();        /// <summary>        /// 日志保存的路径        /// </summary>        string LogPath = ConfigurationManager.AppSettings["LogPath"];        /// <summary>        /// 文件夹路径        /// </summary>        string LogDir = ConfigurationManager.AppSettings["LogDir"];        /// <summary>        /// 文件夹路径        /// </summary>        string LogDateFormat = ConfigurationManager.AppSettings["LogDateFormat"] ?? "yyyyMMddHH";        static string LogLevel = ConfigurationManager.AppSettings["LogLevel"] ?? "Fatal,Error,Debug,Info,Warn";        /// <summary>        /// 日志等级        /// </summary>        private string[] LogLevelArr        {            get            {                if (string.IsNullOrEmpty(LogLevel))                {                    return new string[] { "Fatal", "Error", "Debug", "Info", "Warn" };                }                else                {                    return LogLevel.Split(',').AsQueryable().Where(n => !string.IsNullOrWhiteSpace(n)).ToArray();                }            }        }        /// <summary>        /// 委托        /// </summary>        /// <param name="msg">信息</param>        /// <param name="fileName">文件名</param>        /// <param name="parms">其他的参数</param>        delegate void LogException(string msg, string fileName, params object[] parms);         #endregion        #region 构造函数        /// <summary>        /// 默认构造函数        /// </summary>        public Logger()        { }        /// <summary>        /// 够着函数        /// </summary>        /// <param name="LogDir">日志的文件夹</param>        public Logger(string LogDir)        {            this.LogDir = LogDir;        }        /// <summary>        /// 构造函数        /// </summary>        /// <param name="path"></param>        /// <param name="LogDir"></param>        public Logger(string path, string LogDir)        {            this.LogPath = path;            this.LogDir = LogDir;        }        /// <summary>        /// 构造函数        /// </summary>        /// <param name="path">路径</param>        /// <param name="LogDir">日志路径</param>        /// <param name="logDateFormat">文件格式</param>        public Logger(string path, string logDir, string logDateFormat)        {            this.LogPath = path;            this.LogDir = logDir;            this.LogDateFormat = logDateFormat;        }        #endregion        #region 错误日志记录        /// <summary>        /// 添加错误日志        /// </summary>        /// <param name="ex">错误的信息</param>        /// <param name="parms">其他的参数</param>        public void Error(Exception ex, params object[] parms)        {            var rValue = LogLevelArr.Any(n => n.ToLower().Trim().Equals("error"));            if (!rValue)            {                return;            }            var strMsg = new StringBuilder();            strMsg.AppendFormat("\r\n");            strMsg.AppendFormat("Message:{0}", ex.Message);            strMsg.AppendFormat("\r\n");            strMsg.AppendFormat("StackTrace:{0}", ex.StackTrace);            strMsg.AppendFormat("\r\n");            strMsg.AppendFormat("source:{0}", ex.Source);            strMsg.AppendFormat("\r\n");            strMsg.AppendFormat("InnerException:{0}", ex.InnerException);            strMsg.AppendFormat("\r\n");            new LogException(Log).BeginInvoke(strMsg.ToString(), "Error", parms, new AsyncCallback(CallBack), null);        }        /// <summary>        /// 调试日志        /// </summary>        /// <param name="msg">信息</param>        /// <param name="parms">其他的参数</param>        public void Debug(string msg, params object[] parms)        {            var rValue = LogLevelArr.Any(n => n.ToLower().Trim().Equals("debug"));            if (!rValue)            {                return;            }            new LogException(Log).BeginInvoke(msg, "Debug", parms, new AsyncCallback(CallBack), null);        }        /// <summary>        /// 调试日志        /// </summary>        /// <param name="msg">信息</param>        /// <param name="parms">其他的参数</param>        public void Info(string msg, params object[] parms)        {            var rValue = LogLevelArr.Any(n => n.ToLower().Trim().Equals("info"));            if (!rValue)            {                return;            }            new LogException(Log).BeginInvoke(msg, "Info", parms, new AsyncCallback(CallBack), null);        }        /// <summary>        /// 警告        /// </summary>        /// <param name="msg">信息</param>        /// <param name="parms">其他的参数</param>        public void Warn(string msg, params object[] parms)        {            var rValue = LogLevelArr.Any(n => n.ToLower().Trim().Equals("warn"));            if (!rValue)            {                return;            }            new LogException(Log).BeginInvoke(msg, "Warn", parms, new AsyncCallback(CallBack), null);        }        /// <summary>        /// 错误        /// </summary>        /// <param name="msg">信息</param>        /// <param name="parms">其他的参数</param>        public void Error(string msg, params object[] parms)        {            var rValue = LogLevelArr.Any(n => n.ToLower().Trim().Equals("error"));            if (!rValue)            {                return;            }            new LogException(Log).BeginInvoke(msg, "Error", parms, new AsyncCallback(CallBack), null);        }        /// <summary>        /// 致命错误        /// </summary>        /// <param name="msg">信息</param>        /// <param name="parms">其他的参数</param>        public void Fatal(string msg, params object[] parms)        {            var rValue = LogLevelArr.Any(n => n.ToLower().Trim().Equals("fatal"));            if (!rValue)            {                return;            }            new LogException(Log).BeginInvoke(msg, "Fatal", parms, new AsyncCallback(CallBack), null);        }        /// <summary>        /// 异步回调        /// </summary>        /// <param name="result">异步调用</param>        static void CallBack(IAsyncResult result)        {            var handler = ((AsyncResult)result).AsyncDelegate as LogException;            if (handler != null)            {                handler.EndInvoke(result);            }        }        #endregion        #region 保存日志信息        /// <summary>        /// 保存的日志信息        /// </summary>        /// <param name="msg">错误信息</param>        /// <param name="levelPath">日志等级文件夹</param>        /// <param name="parms">参数</param>        void Log(string msg, string levelPath, params object[] parms)        {            lock (this)            {// --- 同步写入,避免出现文件正在被占用 ---                #region 基本的设置                var fileName = System.DateTime.Now.ToString(LogDateFormat) + ".log";                if (string.IsNullOrEmpty(LogPath))                {                    LogPath = System.AppDomain.CurrentDomain.BaseDirectory;                }                LogPath = string.Format("{0}\\Log\\{1}\\{2}\\", LogPath, levelPath, LogDir);                while (LogPath.Contains(@"\\"))                {                    LogPath = LogPath.Replace(@"\\", @"\");                }                if (!Directory.Exists(LogPath))                {                    Directory.CreateDirectory(LogPath);                }                string filePath = LogPath + fileName;                #endregion                using (var sw = new StreamWriter(filePath, true))                {                    var strMsg = new StringBuilder();                    strMsg.AppendFormat(DateTime.Now.ToString());                    strMsg.Append("-------- start --------");                    strMsg.Append("\r\n");                    strMsg.AppendFormat("{0}", msg);                    strMsg.Append("\r\n");                    if (parms != null)                    {//--- 其他的参数 ---                        strMsg.Append("\r\n");                        foreach (var parm in parms)                        {                            strMsg.Append("\r\n");                            strMsg.Append(parm);                        }                    }                    strMsg.Append("-------- end -------- ");                    strMsg.Append("\r\n\r\n");                    sw.WriteLine(strMsg.ToString());                }            }        }        #endregion    }}

测试代码:

var sw = new Stopwatch();            sw.Start();            for (int i = 0; i < 10000; i++)            {                Utils.Logger.Instance.Debug("Logger测试");            }            sw.Stop();            Console.WriteLine("Logger 日志循环10000次,总耗时:" + sw.ElapsedMilliseconds);            sw = new Stopwatch();            sw.Start();            Parallel.For(0, 100, (i) =>            {                for (int j = 0; j < 100; j++)                {                    Utils.Logger.Instance.Debug("Logger测试");                }            });            sw.Stop();            Console.WriteLine("Logger 并行循环10000次,总耗时:" + sw.ElapsedMilliseconds);            Console.ReadKey();



~~~~~~~~~~太慢啦,后面一篇优化~~~~~~~~~~

阅读全文
0 0