• 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

    效果图:

  • 相关阅读:
    前端编译原理 简述-jison
    GraphQL入门
    前端理解控制反转ioc
    window.onload和JQuery中$(function(){})的区别即其实现原理
    移动web之一像素问题
    display:table和display:table-cell的妙用
    sticky footer布局
    Elements in iteration expect to have 'v-bind:key' directives错误的解决办法
    vue模拟后台数据,请求本地数据的配置(旧版本dev-server.js,新版本webpack.dev.conf.js)
    使用vue-cli脚手架搭建项目,保存编译时出现的代码检查错误(ESLint)
  • 原文地址:https://www.cnblogs.com/s0611163/p/6039871.html
Copyright © 2020-2023  润新知