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
- asp.net c# 异步日志通用类(1)
- asp.net c# 异步日志通用类(2)
- asp.net c# 异步日志通用类(3)
- asp.net c# 异步日志通用类(4)
- c# asp.net winform 调用存储过程的通用类
- asp.net c# 中的队列queue通用类
- C#通用类实现 读取xml控制Asp.net控件输入信息长度(TextBox,FileUpload)
- C#通用类实现 读取xml控制Asp.net控件输入信息长度(TextBox,FileUpload)
- c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作
- c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作
- C# 简易异步日志类
- Asp.Net cookies 通用类
- asp.net gridview通用类
- asp.net抓取通用类
- Asp.net通用缓存类
- .NET通用数据库访问组件,日志组件,C#相关工具
- asp.net生成高质量缩略图通用函数(c#代码)
- ASP.NET生成高质量缩略图通用函数(c#代码)
- msql的root账号忘记密码,修改root密码'mysqld_safe'
- POJ2985 The k-th Largest Group(treap+并查集)
- [Hdu] 4417 Super Mario (主席树模板题)
- java各种进制之间的相互转化
- 2017.08.18【NOIP提高组】模拟赛B组 沙耶的玩偶(doll)
- asp.net c# 异步日志通用类(1)
- Hibernate的悲观锁、乐观锁
- 代码详解の使用CountDownLatch解决面试问题:T1和T2线程执行计算,T3线程计算结果的统计
- CodeForces
- C++基本语法,入门及提高(5)
- C++11 lambda 表达式解析
- hdu6141-多校8&最小树形图&朱刘算法-I am your Father!
- IntelliJ 设置全局maven
- 233A. Perfect Permutation