请选择 进入手机版 | 继续访问电脑版

马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#问题入口 ASP.NET问题入口

【C#问题提交】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接毕业设计】 面试-葵花宝典下载

官方一群:

官方二群:

查看: 15150|回复: 21

6秒完成50万条多线程并发日志文件写入【转】

  [复制链接]
  • TA的每日心情
    开心
    前天 17:07
  • 签到天数: 1794 天

    [LV.Master]伴坛终老

    4252

    主题

    6208

    帖子

    12万

    积分

    管理员

    IBC编程社区-原道楠

    Rank: 9Rank: 9Rank: 9

    积分
    122641

    推广达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2017-7-27 09:54:26 | 显示全部楼层 |阅读模式

    马上加入IBC,查看更多教程

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    100多行代码实现6秒完成50万条多线程并发日志文件写入,支持日志文件分隔

    日志工具类代码:

    [C#] 纯文本查看 复制代码
    using System;
    using System.Collections.Concurrent;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Utils
    {
        /// <summary>
        /// 写日志类
        /// </summary>
        public class LogUtil
        {
            #region 字段
            public static object _lock = new object();
            public static string path = "D:\\log";
            public static int fileSize = 10 * 1024 * 1024; //日志分隔文件大小
            private static ConcurrentQueue<Tuple<string, string>> msgQueue = new ConcurrentQueue<Tuple<string, string>>();
            #endregion
    
            #region 静态构造函数
            static LogUtil()
            {
                Thread thread = new Thread(new ThreadStart(() =>
                {
                    try
                    {
                        int i;
                        List<string> list;
                        Tuple<string, string> tuple;
    
                        while (true)
                        {
                            i = 0;
                            list = new List<string>();
                            while (msgQueue.TryDequeue(out tuple) && i++ < 10000)
                            {
                                list.Add(tuple.Item1.PadLeft(8) + tuple.Item2);
                            }
                            if (list.Count > 0)
                            {
                                WriteFile(list, CreateLogPath());
                            }
    
                            Thread.Sleep(1);
                        }
                    }
                    catch
                    {
    
                    }
                }));
                thread.IsBackground = true;
                thread.Start();
            }
            #endregion
    
            #region 写文件
            /// <summary>
            /// 写文件
            /// </summary>
            public static void WriteFile(List<string> list, 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))
                        {
                            list.ForEach(item =>
                            {
                                #region 日志内容
                                string value = string.Format(@"{0} {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), item);
                                #endregion
    
                                sw.WriteLine(value);
                            });
    
                            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)
            {
                msgQueue.Enqueue(new Tuple<string, string>("[Error] ", log));
            }
            #endregion
    
            #region 写操作日志
            /// <summary>
            /// 写操作日志
            /// </summary>
            public static void Log(string log)
            {
                msgQueue.Enqueue(new Tuple<string, string>("[Info]  ", log));
            }
            #endregion
    
        }
    }



    测试代码:

    [C#] 纯文本查看 复制代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using Utils;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                LogUtil.path = Application.StartupPath + "\\log"; //初始化日志路径
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                for (int n = 0; n < 10; n++)
                {
                    Thread thread = new Thread(new ThreadStart(() =>
                    {
                        int i = 0;
                        for (int k = 0; k < 50000; k++)
                        {
                            LogUtil.Log((i++).ToString() + "    abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcda3.1415bcdabcdabcdabcdabc@#$%^&dabcdabcdabcdabcdabcdabcdabcdabcd");
                        }
                    }));
                    thread.IsBackground = true;
                    thread.Start();
                }
            }
        }
    }





    6秒完成50万条多线程并发日志文件写入,IBC编程社区,www.ibcibc.com,c#教程

    6秒完成50万条多线程并发日志文件写入,IBC编程社区,www.ibcibc.com,c#教程





    游客,如果您要查看本帖隐藏内容请回复





    C#论坛 www.ibcibc.com IBC编程社区
    C#
    C#论坛
    IBC编程社区
  • TA的每日心情
    奋斗
    2021-3-8 09:50
  • 签到天数: 228 天

    [LV.7]常住居民III

    7

    主题

    153

    帖子

    7397

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    7397
    发表于 2017-7-27 09:58:14 | 显示全部楼层
    666
  • TA的每日心情
    慵懒
    2021-3-10 16:01
  • 签到天数: 1009 天

    [LV.10]以坛为家III

    57

    主题

    279

    帖子

    3万

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    35463
    发表于 2017-7-28 08:46:59 | 显示全部楼层
    666

    该用户从未签到

    0

    主题

    1

    帖子

    9

    积分

    新手上路

    Rank: 1

    积分
    9
    发表于 2017-7-28 11:00:29 | 显示全部楼层
    学习一下
  • TA的每日心情
    奋斗
    2018-8-9 10:17
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    0

    主题

    6

    帖子

    68

    积分

    注册会员

    Rank: 2

    积分
    68
    发表于 2017-9-28 17:04:42 | 显示全部楼层
    楼主感谢分享,下载试下!
  • TA的每日心情
    奋斗
    2018-8-9 10:17
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    0

    主题

    6

    帖子

    68

    积分

    注册会员

    Rank: 2

    积分
    68
    发表于 2017-9-28 17:05:06 | 显示全部楼层
    楼主感谢分享,下载试下!
  • TA的每日心情
    奋斗
    2018-2-2 11:45
  • 签到天数: 2 天

    [LV.1]初来乍到

    0

    主题

    20

    帖子

    185

    积分

    注册会员

    Rank: 2

    积分
    185
    发表于 2018-1-24 13:48:15 | 显示全部楼层
    学习,学习,学习
  • TA的每日心情
    难过
    2020-9-14 23:58
  • 签到天数: 416 天

    [LV.9]以坛为家II

    1

    主题

    42

    帖子

    1万

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    12644
    发表于 2018-3-2 00:04:58 | 显示全部楼层
    學習一下

    该用户从未签到

    0

    主题

    3

    帖子

    14

    积分

    新手上路

    Rank: 1

    积分
    14
    发表于 2018-5-10 10:42:20 | 显示全部楼层

    该用户从未签到

    0

    主题

    1

    帖子

    7

    积分

    新手上路

    Rank: 1

    积分
    7
    发表于 2018-9-19 18:49:04 | 显示全部楼层
    不想用log4net的配置文件,参考下大神的代码,多谢
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则