zoukankan      html  css  js  c++  java
  • C#写文本日志帮助类(支持多线程)改进版(不适用于ASP.NET程序)

    由于iis的自动回收机制,不适用于ASP.NET程序

    代码:

    using System;
    using System.Collections.Concurrent;
    using System.Configuration;
    using System.IO;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace CommonDll
    {
        /// <summary>
        /// 写日志类
        /// </summary>
        public class LogUtil
        {
            #region 字段
            public static string path = ConfigurationManager.AppSettings["LogPath"];
            public static int fileSize = 10 * 1024 * 1024; //日志分隔文件大小
            private static ConcurrentQueue<Tuple<string, DateTime>> queue = new ConcurrentQueue<Tuple<string, DateTime>>();
            #endregion
    
            #region 构造函数
            static LogUtil()
            {
                Task.Factory.StartNew(new Action(delegate()
                {
                    StringBuilder log;
                    string path;
                    Tuple<string, DateTime> tuple;
                    string item;
    
                    while (true)
                    {
                        log = new StringBuilder();
                        path = CreateLogPath();
    
                        while (queue.TryDequeue(out tuple))
                        {
                            item = string.Format(@"{0} {1}", tuple.Item2.ToString("yyyy-MM-dd HH:mm:ss.fff"), tuple.Item1);
                            log.AppendFormat("
    {0}", item);
                        }
    
                        if (log.Length > 0) WriteFile(log.ToString(2, log.Length - 2), path);
                        Thread.Sleep(100);
                    }
                }));
            }
            #endregion
    
            #region 写文件
            /// <summary>
            /// 写文件
            /// </summary>
            public static void WriteFile(string log, string path)
            {
                try
                {
                    if (!Directory.Exists(Path.GetDirectoryName(path)))
                    {
                        Directory.CreateDirectory(Path.GetDirectoryName(path));
                    }
    
                    if (!File.Exists(path))
                    {
                        using (FileStream fs = new FileStream(path, FileMode.Create)) { fs.Close(); }
                    }
    
                    using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write))
                    {
                        using (StreamWriter sw = new StreamWriter(fs))
                        {
                            sw.WriteLine(log);
                            sw.Flush();
                        }
                        fs.Close();
                    }
                }
                catch { }
            }
            #endregion
    
            #region 生成日志文件路径
            /// <summary>
            /// 生成日志文件路径
            /// </summary>
            public static string CreateLogPath()
            {
                int index = 0;
                string logPath;
                bool bl = true;
                do
                {
                    index++;
                    logPath = Path.Combine(path, "Log" + DateTime.Now.ToString("yyyyMMdd") + (index == 1 ? "" : "_" + index.ToString()) + ".txt");
                    if (File.Exists(logPath))
                    {
                        FileInfo fileInfo = new FileInfo(logPath);
                        if (fileInfo.Length < fileSize)
                        {
                            bl = false;
                        }
                    }
                    else
                    {
                        bl = false;
                    }
                } while (bl);
    
                return logPath;
            }
            #endregion
    
            #region 写错误日志
            /// <summary>
            /// 写错误日志
            /// </summary>
            public static void LogError(string log)
            {
                queue.Enqueue(new Tuple<string, DateTime>("[Error] " + log, DateTime.Now));
            }
            #endregion
    
            #region 写操作日志
            /// <summary>
            /// 写操作日志
            /// </summary>
            public static void Log(string log)
            {
                queue.Enqueue(new Tuple<string, DateTime>("[Info]  " + log, DateTime.Now));
            }
            #endregion
    
        }
    }
    View Code

    测试代码:

    private void button1_Click(object sender, EventArgs e)
    {
        int n = 10000;
        DateTime dtStart = DateTime.Now;
        for (int i = 1; i <= n; i++)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object obj)
            {
                int j = (int)obj;
                LogUtil.Log("测试" + j.ToString("00000"));
    
                if (j == n)
                {
                    double sec = DateTime.Now.Subtract(dtStart).TotalSeconds;
                    MessageBox.Show(n + "条日志完成,耗时" + sec.ToString("0.000") + "");
                }
            }), i);
        }
    }
    View Code

    效果图:

  • 相关阅读:
    你最该知道的事(职场)
    C++ OTL MySQL(Windows/Linux) V8.1
    mysql字符串替换
    NYOJ 17 单调递增最长子序列
    IOS Sqlite用户界面增删改查案例
    时间戳工具类
    2014年7月10日,我人生的最重要Upgrade
    Java线程演示样例
    hiho模拟面试题2 补提交卡 (贪心,枚举)
    Android.mk添加本地程序和库的经常使用模版
  • 原文地址:https://www.cnblogs.com/s0611163/p/6039871.html
Copyright © 2011-2022 走看看