开源日志log4net使用起来很方便,但是项目中不让用,所以自己重写了一个类,用来记录日志,比较简单。

1、首先是可以把日志分成多个类型,分别记录到不同的文件中

  1. /// <summary>
  2. /// 日志类型
  3. /// </summary>
  4. public enum LogType
  5. {
  6. /// <summary>
  7. /// 插入型
  8. /// </summary>
  9. Insert,
  10. /// <summary>
  11. /// 更新型
  12. /// </summary>
  13. Update,
  14. /// <summary>
  15. /// 所有
  16. /// </summary>
  17. All,
  18. /// <summary>
  19. /// 结尾,放在最后
  20. /// </summary>
  21. End
  22. }

我的是分三个,insert插入,update更新,all包括所有的日志。

2、接下来是LogHelper类,代码中已注释,不多说,直接上代码

  1. /// <summary>
  2. /// 记录日志
  3. /// </summary>
  4. public class LogHelper
  5. {
  6.  
  7. #region 自定义变量
  8. /// <summary>
  9. /// 异常信息的队列
  10. /// </summary>
  11. private static Queue<string> qMsg = null;
  12. /// <summary>
  13. /// 文件大小最大值,单位:Mb
  14. /// </summary>
  15. private static int maxFileSize = ;
  16. /// <summary>
  17. /// 当天创建同一类型的日志文件的个数
  18. /// </summary>
  19. private static int[] createdFileCounts = new int[(int)LogType.End];
  20. /// <summary>
  21. /// 日志文件存放路径
  22. /// </summary>
  23. private static string logFilePath = "";
  24. #endregion
  25.  
  26. #region 属性
  27. /// <summary>
  28. /// 文件大小最大值,单位:Mb。小于0时则不限制
  29. /// </summary>
  30. public static int MaxFileSize
  31. {
  32. get { return maxFileSize; }
  33. set { maxFileSize = value; }
  34. }
  35. /// <summary>
  36. /// 日志文件存放路径
  37. /// </summary>
  38. public static string LogFilePath
  39. {
  40. set { logFilePath = value; }
  41. get
  42. {
  43. if (!String.IsNullOrEmpty(logFilePath))
  44. {
  45. return logFilePath;
  46. }
  47. else
  48. {
  49. return System.Windows.Forms.Application.StartupPath + "\\Log\\" + DateTime.Now.ToString("yyyy-MM-dd");
  50. }
  51. }
  52. }
  53. #endregion
  54.  
  55. #region 构造函数
  56. /// <summary>
  57. /// 静态构造函数
  58. /// </summary>
  59. static LogHelper()
  60. {
  61. qMsg = new Queue<string>();
  62. SetCreatedFileCount();
  63. RunThread();
  64. }
  65. #endregion
  66.  
  67. #region 辅助
  68. /// <summary>
  69. /// 获取日志文件的全路径
  70. /// </summary>
  71. /// <param name="logType"></param>
  72. /// <returns></returns>
  73. private static string GetLogPath(LogType logType, bool isCreateNew)
  74. {
  75. string logPath = LogFilePath;
  76. if (!Directory.Exists(logPath))
  77. {
  78. Directory.CreateDirectory(logPath);
  79. //看成是新的一天,要将昨天的数据清空
  80. for (int i = ; i < createdFileCounts.Length; i++)
  81. {
  82. createdFileCounts[i] = ;
  83. }
  84. }
  85. switch (logType)
  86. {
  87. case LogType.Insert:
  88. logPath = logPath + "\\" + "Insert";
  89. break;
  90. case LogType.Update:
  91. logPath = logPath + "\\" + "Update";
  92. break;
  93. default:
  94. logPath = logPath + "\\" + "All";
  95. break;
  96. }
  97. if (isCreateNew)
  98. {
  99. int num = ++createdFileCounts[(int)logType];
  100. logPath += string.Format("({0}).log", num);
  101. return logPath;
  102. }
  103.  
  104. logPath += ".log";
  105. //createdFileCounts[(int)logType] = 0;
  106. if (!File.Exists(logPath))
  107. {
  108. //File.Create(logPath);
  109. FileStream fs = File.Create(logPath);
  110. fs.Close();
  111. fs.Dispose();
  112. }
  113.  
  114. return logPath;
  115. }
  116.  
  117. /// <summary>
  118. /// 运行线程
  119. /// </summary>
  120. private static void RunThread()
  121. {
  122. ThreadPool.QueueUserWorkItem(u =>
  123. {
  124. while (true)
  125. {
  126. string tmsg = string.Empty;
  127. lock (qMsg)
  128. {
  129. if (qMsg.Count > )
  130. tmsg = qMsg.Dequeue();
  131. }
  132.  
  133. //往日志文件中写错误信息
  134. if (!String.IsNullOrEmpty(tmsg))
  135. {
  136. int index = tmsg.IndexOf("&&");
  137. string logTypeStr = tmsg.Substring(, index);
  138. LogType logType = LogType.All;
  139. if (logTypeStr == string.Format("{0}", LogType.Insert))
  140. {
  141. logType = LogType.Insert;
  142. }
  143. else if (logTypeStr == string.Format("{0}", LogType.Update))
  144. {
  145. logType = LogType.Update;
  146. }
  147.  
  148. //记录所有日志
  149. WriteLog(tmsg.Substring(index + ));
  150. //分开记录日志
  151. if (logType != LogType.All)
  152. {
  153. WriteLog(tmsg.Substring(index + ), logType);
  154. }
  155. }
  156.  
  157. if (qMsg.Count <= )
  158. {
  159. Thread.Sleep();
  160. }
  161. }
  162. });
  163. }
  164.  
  165. /// <summary>
  166. /// 程序刚启动时 检测已创建的日志文件个数
  167. /// </summary>
  168. private static void SetCreatedFileCount()
  169. {
  170. string logPath = LogFilePath;
  171. if (!Directory.Exists(logPath))
  172. {
  173. for (int i = ; i < createdFileCounts.Length; i++ )
  174. {
  175. createdFileCounts[i] = ;
  176. }
  177. }
  178. else
  179. {
  180. DirectoryInfo dirInfo = new DirectoryInfo(logPath);
  181. FileInfo[] fileInfoes = dirInfo.GetFiles("*.log");
  182. foreach (FileInfo fi in fileInfoes)
  183. {
  184. string fileName = Path.GetFileNameWithoutExtension(fi.FullName).ToLower();
  185. if (fileName.Contains('(') && fileName.Contains(')'))
  186. {
  187. fileName = fileName.Substring(, fileName.LastIndexOf('('));
  188. switch (fileName)
  189. {
  190. case "insert":
  191. createdFileCounts[(int)LogType.Insert]++;
  192. break;
  193. case "update":
  194. createdFileCounts[(int)LogType.Update]++;
  195. break;
  196. case "all":
  197. createdFileCounts[(int)LogType.All]++;
  198. break;
  199. default:
  200. break;
  201. }
  202. }
  203. }
  204.  
  205. }
  206. }
  207. #endregion
  208.  
  209. #region 写日志
  210.  
  211. /// <summary>
  212. /// 写日志
  213. /// </summary>
  214. /// <param name="strLog">日志内容</param>
  215. public static void WriteLog(string strLog)
  216. {
  217. WriteLog(strLog, LogType.All);
  218. }
  219.  
  220. /// <summary>
  221. /// 写日志
  222. /// </summary>
  223. /// <param name="strLog">日志内容</param>
  224. /// <param name="logType">日志类型</param>
  225. public static void WriteLog(string strLog, LogType logType)
  226. {
  227. if (String.IsNullOrEmpty(strLog))
  228. {
  229. return;
  230. }
  231. strLog = strLog.Replace("\n", "\r\n");
  232.  
  233. FileStream fs = null;
  234. try
  235. {
  236. string logPath = GetLogPath(logType, false);
  237. FileInfo fileInfo = new FileInfo(logPath);
  238. if (MaxFileSize > && fileInfo.Length > ( * * MaxFileSize))
  239. {
  240. fileInfo.MoveTo(GetLogPath(logType, true));
  241. }
  242. fs = File.Open(logPath, FileMode.OpenOrCreate);
  243. //fs = File.OpenWrite(logPath);
  244. byte[] btFile = Encoding.UTF8.GetBytes(strLog);
  245. //设定书写的開始位置为文件的末尾
  246. fs.Position = fs.Length;
  247. //将待写入内容追加到文件末尾
  248. fs.Write(btFile, , btFile.Length);
  249. }
  250. finally
  251. {
  252. if (fs != null)
  253. {
  254. fs.Close();
  255. fs.Dispose();
  256. }
  257. }
  258. }
  259.  
  260. /// <summary>
  261. /// 写入错误日志队列
  262. /// </summary>
  263. /// <param name="msg">错误信息</param>
  264. public static void WriteLogAsync(string strLog, LogType logType)
  265. {
  266. //将错误信息添加到队列中
  267. lock (qMsg)
  268. {
  269. qMsg.Enqueue(string.Format("{0}&&{1}\r\n", logType, strLog));
  270. }
  271. }
  272. #endregion
  273.  
  274. }

使用时,可以直接调用WriteLogAsync函数,将消息添加到队列中,然后在另外的线程中处理队列中的消息。

其中,如果没有给LogFilePath属性赋值,则有一个默认的文件存放路径。MaxFileSize属性是用来限制日志文件大小的,如果小于等于0则表示不限制。如果有限制,当文件大小超过这个最大值后会将原来的文件重命名,然后再创建一个“自己”。例如:正在存放日志的文件名为"All.log",当它满了以后就成为“All(n).log”文件,n为从1开始递增的数字,然后会重新创建一个“All.log”文件接着存放日志。

日志记录类LogHelper的更多相关文章

  1. 【个人使用.Net类库】(2)Log日志记录类

    开发接口程序时,要保证程序稳定运行就要时刻监控接口程序发送和接收的数据,这就需要一个日志记录的类将需要的信息记录在日志文件中,便于自己维护接口程序.(Web系统也是如此,只是对应的日志实现比这个要复杂 ...

  2. C# 简单日志帮助类LogHelper

    调用: LogHelper.Debug(""); LogHelper.Info(""); LogHelper.Error(""); 项目添加 ...

  3. 【C#通用类】日志记录类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  4. C#日志记录类

    public class WriteLog { /// <summary> /// 将错误写入文件中 /// </summary> /// <param name=&qu ...

  5. 日志记录类库log4net的使用总结

    log4net是一个开源的日志记录类库,经过配置后可以自动抓取程序中的错误.异常信息,并写入磁盘,也可以在异常发生时执行其他指定的操作,比如:通知某人右键.写入数据库等.这里写个ASP.NET MVC ...

  6. 利用AOP与ToStringBuilder简化日志记录

    刚学spring的时候书上就强调spring的核心就是ioc和aop blablabla...... IOC到处都能看到...AOP么刚开始接触的时候使用在声明式事务上面..当时书上还提到一个用到ao ...

  7. 将错误日志记录在txt文本里

    引言 对于已经部署的系统一旦出错对于我们开发人员来说是比较痛苦的事情,因为我们不能跟踪到错误信息,不能 很快的定位到我们的错误位置在哪,这时候如果能像开发环境一样记录一些堆栈信息就可以了,这时候我们就 ...

  8. Spring AOP进行日志记录

    在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...

  9. Java 基于log4j的日志工具类

    对log4j日志类进行了简单封装,使用该封装类的优势在于以下两点: 1.不必在每个类中去创建对象,直接类名 + 方法即可 2.可以很方便的打印出堆栈信息 package com.tradeplatfo ...

随机推荐

  1. Visual Studio 2008 – ASP.NET “System.Runtime.InteropServices.COMException”

    The Issue When openning an existing ASP.NET project for the first time in Visual Studio 2008 it retu ...

  2. android中少用静态变量(android静态变量static生命周期)

    在android中,要少用静态变量. 我现在做的一个应用中,之前的开发人员使用静态变量来存储cookie,这个全局的静态变量用来验证身份. 这时客户反应,应用长时间不使用,再次使用,会提示身份过期. ...

  3. 射频识别技术漫谈(15)——Mifare1的安全性及7字节序列号M1卡【worlsing笔记】

    Mifare1的安全性主要指卡中数据的安全性,要求卡中的数据不能被非法修改或窃听.数据的安全性主要使用加密技术来保证,加密技术有两个关键因素:加密算法和密钥.现代加密技术的一大特点是加密算法公开,如果 ...

  4. (莱昂氏unix源代码分析导读-50)LP11行式打印机

    by cszhao1980 LP11有两个设备寄存器:状态寄存器(lpsr)和数据缓冲寄存器(lpbuf),可通过以下结构进行访问: 8812: #define LPADDR 0177514 8823 ...

  5. Arrays.asList的源码分析

    以前一直很奇怪为什么Arrays.asList的数组不能插入新的数据,后来看了源码发现是因为内部是一个final的数组支持起来的Arraylist,下面贴入源码与分析. 1.先看Arrays的方法 我 ...

  6. 在eclipse中使用javap工具反汇编

    1.配置 Run---external tools---external tools configurations 选择Program 新建javap运行方式 设置location.workspace ...

  7. 修改cmd字体为Consolas

    windows下的cmd窗口默认的字体有点难看,长时间使用操作nodejs有点小疲劳,可以修改注册表替换字体为Consolas,并且可以全屏cmd窗口,代码如下: Windows Registry E ...

  8. DES 算法的 C++ 与 JAVA 互相加解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. 对PostgreSQL的prepared statement的深入理解

    看官方文档: http://www.postgresql.org/docs/current/static/sql-prepare.html PREPARE creates a prepared sta ...

  10. PS Studio调用.exe输出错误信息的解决办法

    在一个button_click下调用了如下外部可执行文件: $button1_Click = { #TODO: Place custom script here .\PsExec.exe \\192. ...