zoukankan      html  css  js  c++  java
  • C# 日志记录工具类--LogHelper.cs测试


    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 > 0)
     89                     {
     90                         Monitor.Enter(MsgQueue);
     91                         string msg = MsgQueue.Dequeue();
     92                         Monitor.Exit(MsgQueue);
     93                         logStreamWriter.WriteLine(msg);
     94                         if (GetFileSize(fileName) > 1024 * 5)
     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 = 0;
    123             if (File.Exists(fileName))
    124             {
    125                 var myFs=new FileInfo(fileName);
    126                 strRe = myFs.Length / 1024;
    127                 //Console.WriteLine(strRe);
    128             }
    129             return strRe;
    130         }
    131         private static void CopyToBak(string sFileName)
    132         {
    133             int fileCount = 0;
    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;//停止记录

    Tools.Log.LogHelper.
    ExitThread();// 退出日志记录线程,一般在程序退出时候调用。
    
    

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

  • 相关阅读:
    Infopath Notify 弹出提示信息
    window.showModalDialog 返回值
    【转】获得正文内容中的所有img标签的图片路径
    Json Datable Convert
    Sharepoint 列表 附件 小功能
    Surgey 权限更改
    SQL 触发器用于IP记录转换
    Caml语句 查询分配给当前用户及当前组
    jquery 1.3.2 auto referenced when new web application in VSTS2010(DEV10)
    TFS diff/merge configuration
  • 原文地址:https://www.cnblogs.com/qyfh/p/8616877.html
Copyright © 2011-2022 走看看