首页 > 代码库 > 分享一个记录日志的类,可多线程使用。
分享一个记录日志的类,可多线程使用。
好久没写博客了,今天分享一个自己用的日志类,非原创,借鉴了前辈的一个想法,然后修改来的。
日志我们是必须的,现在程序都是多线程并发了,记日志就有可能出现问题了,lock?影响性能。log4net太重量级了,本日志是一个轻量级的小工具。
废话不多说,看源码:
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Text; 5 6 namespace GEDU.CourseOnline.Common 7 { 8 /// <summary> 9 /// 日志类(多线程版) 10 /// </summary> 11 public class LogHelper 12 { 13 private string _fileName; 14 private static Dictionary<long, long> lockDic = new Dictionary<long, long>(); 15 16 /// <summary> 17 /// 获取或设置文件名称 18 /// </summary> 19 public string FileName 20 { 21 get { return _fileName; } 22 set { _fileName = value; } 23 } 24 25 /// <summary> 26 /// 构造函数 27 /// </summary> 28 /// <param name="fileName">文件全路径名</param> 29 public LogHelper(string fileName) 30 { 31 if (string.IsNullOrEmpty(fileName)) 32 { 33 throw new Exception("FileName不能为空!"); 34 } 35 Create(fileName); 36 _fileName = fileName; 37 } 38 39 /// <summary> 40 /// 创建文件路径 41 /// </summary> 42 /// <param name="fileName">文件路径</param> 43 public void Create(string fileName) 44 { 45 var directoryPath = Path.GetDirectoryName(fileName); 46 if (string.IsNullOrEmpty(directoryPath)) 47 { 48 throw new Exception("FileName路径错误!"); 49 } 50 if (!Directory.Exists(directoryPath)) 51 { 52 Directory.CreateDirectory(directoryPath); 53 } 54 } 55 56 /// <summary> 57 /// 写入文本 58 /// </summary> 59 /// <param name="content">文本内容</param> 60 /// <param name="newLine">换行标记</param> 61 private void Write(string content, string newLine) 62 { 63 using (FileStream fs = new FileStream(_fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 8, FileOptions.Asynchronous)) 64 { 65 Byte[] dataArray = Encoding.UTF8.GetBytes(content + newLine); 66 bool flag = true; 67 long slen = dataArray.Length; 68 long len = 0; 69 while (flag) 70 { 71 try 72 { 73 if (len >= fs.Length) 74 { 75 fs.Lock(len, slen); 76 lockDic[len] = slen; 77 flag = false; 78 } 79 else 80 { 81 len = fs.Length; 82 } 83 } 84 catch (Exception ex) 85 { 86 while (!lockDic.ContainsKey(len)) 87 { 88 len += lockDic[len]; 89 } 90 } 91 } 92 fs.Seek(len, SeekOrigin.Begin); 93 fs.Write(dataArray, 0, dataArray.Length); 94 fs.Close(); 95 } 96 } 97 98 /// <summary> 99 /// 写入文件内容 100 /// </summary> 101 /// <param name="content">内容</param> 102 public void WriteLine(string content)103 {104 this.Write(content, Environment.NewLine);105 }106 107 /// <summary> 108 /// 写入文件内容 不换行109 /// </summary> 110 /// <param name="content">内容</param> 111 public void Write(string content)112 {113 this.Write(content, "");114 }115 }116 }
用法:
1 string strPath = HttpContext.Current.Server.MapPath(string.Format("/Log/{0:yyyyMMdd}.txt", DateTime.Today));2 //string strPath = string.Format(@"D:\Log\{0:yyyyMMdd}.txt", DateTime.Today);3 LogHelper logHelper = new LogHelper(strPath);4 logHelper.WriteLine(sWord + " 时间:" + DateTime.Now);
如有不足还请指教。
分享一个记录日志的类,可多线程使用。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。