1. C# 日志记录工具类:(适用于不想使用log4j等第三方的Log工具的时候,希望自己写个简单类实现)
    LogHelper.cs内容如下:
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Collections.Generic;
  7.  
  8. namespace Tools.Log
  9. {
  10. /// <summary>
  11. /// 多线程安全Log记录工具20180314
  12. /// </summary>
  13. public class LogHelper
  14. {
  15. //为了使用DBGView进行在线调试:
  16. //System.Diagnostics.Debug.WriteLine("Debug模式可见")
  17. //System.Diagnostics.Trace.WriteLine("Debug、Release都可见");
  18.  
  19. private static Thread WriteThread;
  20. private static readonly Queue<string> MsgQueue;
  21.  
  22. private static readonly string FilePath;
  23.  
  24. private static Boolean autoResetEventFlag = false;
  25. private static AutoResetEvent aEvent = new AutoResetEvent(false);
  26. private static bool flag = true;
  27. public static bool LogFlag = true;
  28.  
  29. static LogHelper()
  30. {
  31. FilePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "App_Log\\";
  32. WriteThread = new Thread(WriteMsg);
  33. MsgQueue = new Queue<string>();
  34. WriteThread.Start();
  35. }
  36.  
  37. public static void LogInfo(string msg)
  38. {
  39. Monitor.Enter(MsgQueue);
  40. MsgQueue.Enqueue(string.Format("{0} {1} {2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss"), "Info", msg));
  41. Monitor.Exit(MsgQueue);
  42. if (autoResetEventFlag) {
  43. aEvent.Set();
  44. }
  45. }
  46. public static void LogError(string msg)
  47. {
  48. Monitor.Enter(MsgQueue);
  49. MsgQueue.Enqueue(string.Format("{0} {1} {2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss"), "Error", msg));
  50. Monitor.Exit(MsgQueue);
  51. if (autoResetEventFlag)
  52. {
  53. aEvent.Set();
  54. }
  55. }
  56. public static void LogWarn(string msg)
  57. {
  58. Monitor.Enter(MsgQueue);
  59. MsgQueue.Enqueue(string.Format("{0} {1} {2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss"), "Warn", msg));
  60. Monitor.Exit(MsgQueue);
  61. if (autoResetEventFlag)
  62. {
  63. aEvent.Set();
  64. }
  65. }
  66.  
  67. /// <summary>
  68. /// ExitThread是退出日志记录线程的方法,一旦退出,无法开启,一般在程序关闭时执行
  69. /// </summary>
  70. public static void ExitThread() {
  71. flag = false;
  72. aEvent.Set();//恢复线程执行
  73. }
  74. private static void WriteMsg()
  75. {
  76. while (flag)
  77. {
  78. //进行记录
  79. if (LogFlag)
  80. {
  81. autoResetEventFlag = false;
  82. if (!Directory.Exists(FilePath))
  83. {
  84. Directory.CreateDirectory(FilePath);
  85. }
  86. string fileName = FilePath + DateTime.Now.ToString("yyyy-MM-dd") + "-Dic.log";
  87. var logStreamWriter = new StreamWriter(fileName, true);
  88. while (MsgQueue.Count > )
  89. {
  90. Monitor.Enter(MsgQueue);
  91. string msg = MsgQueue.Dequeue();
  92. Monitor.Exit(MsgQueue);
  93. logStreamWriter.WriteLine(msg);
  94. if (GetFileSize(fileName) > * )
  95. {
  96. logStreamWriter.Flush();
  97. logStreamWriter.Close();
  98. CopyToBak(fileName);
  99. logStreamWriter = new StreamWriter(fileName, false);
  100. logStreamWriter.Write("");
  101. logStreamWriter.Flush();
  102. logStreamWriter.Close();
  103. logStreamWriter = new StreamWriter(fileName, true);
  104. }
  105. //下面用于DbgView.exe工具进行在线调试
  106. System.Diagnostics.Debug.WriteLine("BS_Debug:"+msg);
  107. System.Diagnostics.Trace.WriteLine("BS_Release:" + msg);
  108. }
  109. logStreamWriter.Flush();
  110. logStreamWriter.Close();
  111. autoResetEventFlag = true;
  112. aEvent.WaitOne();
  113. }
  114. else {
  115. autoResetEventFlag = true;
  116. aEvent.WaitOne();
  117. }
  118. }
  119. }
  120. private static long GetFileSize(string fileName)
  121. {
  122. long strRe = ;
  123. if (File.Exists(fileName))
  124. {
  125. var myFs=new FileInfo(fileName);
  126. strRe = myFs.Length / ;
  127. //Console.WriteLine(strRe);
  128. }
  129. return strRe;
  130. }
  131. private static void CopyToBak(string sFileName)
  132. {
  133. int fileCount = ;
  134. string sBakName = "";
  135. do
  136. {
  137. fileCount++;
  138. sBakName = sFileName + "." + fileCount + ".BAK";
  139. }
  140. while (File.Exists(sBakName));
  141. File.Copy(sFileName, sBakName);
  142. }
  143. }
  144. }

该类由BS风华改编自网上一个类。实现了多线程下面安全记录日志的功能:

使用方法:

  1. Tools.Log.LogHelper.LogFlag = true; //开启记录
  2. Tools.Log.LogHelper.LogInfo("==========日志记录内容 Info====");
  3. Tools.Log.LogHelper.LogWarn("==========日志记录内容 Warn====");
  4. Tools.Log.LogHelper.LogError("==========日志记录内容 Error====");
  5. Tools.Log.LogHelper.LogFlag = false;//停止记录
  6.  
  7. Tools.Log.LogHelper.ExitThread();// 退出日志记录线程,一般在程序退出时候调用。
  1.  

如果有更好的方式,欢迎留言

C# 日志记录工具类--LogHelper.cs测试的更多相关文章

  1. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  2. 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  3. 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,nloglogutil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  4. LogHelper 日志记录帮助类

    1.LogHelper 日志记录帮助类 using System; using System.Collections.Generic; using System.Linq; using System. ...

  5. HttpClientUntils工具类的使用测试及注意事项(包括我改进的工具类和Controller端的注意事项【附 Json 工具类】)

    HttpClient工具类(我改过): package com.taotao.httpclient; import java.io.IOException; import java.net.URI; ...

  6. 基于SQLite日志记录工具--Log4W

    最近压迫自己写点自己的东西,但是水平不高,槽点多,望各位请轻喷,嘿嘿! 以前用过一个Log4Net的东东,但是保存的是文本文件,不好过滤,而且用的不多,也不太熟悉,所以自己也当写一个练练手吧!     ...

  7. AspNetCore.FileLog 一款很不错的日志记录工具

    AspNetCore.FileLog 该项目作者为伟哥,GitHub地址:https://github.com/amh1979:该项目维护者为鸟窝,GitHub地址:https://github.co ...

  8. Java日志记录工具SLF4J介绍

    SLF4J是什么 SLF4J是一个包装类,典型的facade模式的工具,对用户呈现统一的操作方式,兼容各种主流的日志记录框架,典型的有log4j/jdk logging/nop/simple/jaka ...

  9. log4j2和logback动态修改日志级别工具类

    工作中,在排查线上问题时,有以下场景在不重新部署或重启服务的情况下,需要动态调整线上日志级别 1.线上有些日志打印过多干扰有用的日志,需要动态修改线上日志记录器的打印日志级别,调高一些日志级别,打印出 ...

随机推荐

  1. c++ json 详解

    一. 使用jsoncpp解析json Jsoncpp是个跨平台的开源库,首先从http://jsoncpp.sourceforge.net/上下载jsoncpp库源码,我下载的是v0.5.0,压缩包大 ...

  2. MAC 设置环境变量path的常用方法

    单个用户设置 1)~/.bash_profile (任意一个文件中添加用户级环境变量) (注:Linux 里面是 .bashrc 而 Mac 是 .bash_profile) 若bash shell是 ...

  3. 生成html报告并整合自动发动邮件功能

    from HTMLTestRunner import HTMLTestRunnerfrom email.mime.text import MIMETextfrom email.header impor ...

  4. JS实现表单多文件上传样式美化支持选中文件后删除相关项

    http://www.youdaili.net/javascript/5903.html

  5. js模板引擎之artTemplate

    http://www.cnblogs.com/52fhy/p/5393673.html artTemplate 不支持requre.js,悲剧啊,只能用juicer啊 这个还是比较有名的. 简介: a ...

  6. windows 安装操作系统时切换分区表格式

    在出现分区管理界面时,按下shift+F10呼出命令行,输入diskpart 后尝试如下命令将磁盘分区表手动转换到MBR. list disk ---- 显示当前磁盘列表 select disk x ...

  7. postman的Testing examples(测试脚本示例)

    测试代码会在发送request并且接收到responses后执行. 1.设置环境变量 postman.setEnvironmentVariable("key", "val ...

  8. C#中委托如何使用?(转帖)

    1.委托概述委托是C#中新加入的一个类型,可以把它想作一个和Class类似的一种类型,和使用类相似,使用一个委托时,需要两个步骤,首先你要定义一个委托,就像是定义一个类一样:然后,你可以创建一个或多个 ...

  9. JZ2440 裸机驱动 第14章 ADC和触摸屏接口

    本章目标:     了解S3C2410/S3C2440和触摸屏的结构:     了解电阻触摸屏的工作原理和等效电路图:     了解S3C2410/S3C2440触摸屏控制器的多种工作模式:     ...

  10. 【python】专用下划线标识符说明

    __xxx__:系统定义名字 __xxx:类中私有变量名 说明:__xxx看做“私有的”,在模块或者类外是不可以使用.