支持多线程写入txt,日志文件

第一种文件共享方式会丢失数据,FileShare.Write:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void WriteLog()
        {
            try
            {
                var logFilePath = "log.txt";
                var now = DateTime.Now;
                var logContent = string.Format("Tid: {0}{1} {2}.{3}\r\n", Thread.CurrentThread.ManagedThreadId.ToString().PadRight(4), now.ToLongDateString(), now.ToLongTimeString(), now.Millisecond.ToString());
 
                var logContentBytes = Encoding.Default.GetBytes(logContent);
                //由于设置了文件共享模式为允许随后写入,所以即使多个线程同时写入文件,也会等待之前的线程写入结束之后再执行,而不会出现错误
                using (FileStream logFile = new FileStream(logFilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
                {
                    logFile.Seek(0, SeekOrigin.End);
                    logFile.Write(logContentBytes, 0, logContentBytes.Length);
                }
 
                  
            }
            catch (Exception ex)
            {
                  
                Console.WriteLine(ex.Message);
            }

  

第二种 ReaderWriterLockSlim: 

 

复制代码
   public static void WriteFile(string i)
        {

            var sqlPath= System.IO.Directory.GetCurrentDirectory()+ "\\log\\sql";

            if (!Directory.Exists(sqlPath))
            {
                DirectoryInfo di = Directory.CreateDirectory(sqlPath);
            }
             
            var logFilePath = sqlPath + "\\"+DateTime.Now.ToString("yyyy-MM-dd")+".txt";
            lockSlim.EnterWriteLock();//打开写操作锁
            try
            {
                string TestText = i.ToString();
                File.AppendAllText(logFilePath, i+ "\r\n");
            }
            finally
            {
                lockSlim.ExitWriteLock();//占用完后退出
            }
        }
复制代码

 

推荐第二种

 

完整版:

复制代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace StdioMQTT
{
   public  class LogHelper
    {
        static ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim();

        public static void SqlWriteFile(string i)
        {

            var sqlPath = System.IO.Directory.GetCurrentDirectory() + "\\log\\sql";

            if (!Directory.Exists(sqlPath))
            {
                DirectoryInfo di = Directory.CreateDirectory(sqlPath);
            }

            var logFilePath = sqlPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
            lockSlim.EnterWriteLock();//打开写操作锁
            try
            {
                string TestText = i+ DateTime.Now.ToString();
                File.AppendAllText(logFilePath, i + "\r\n");
            }
            finally
            {
                lockSlim.ExitWriteLock();//占用完后退出
            }
        }

        public static void InfoWriteFile(string i)
        {

            var sqlPath = System.IO.Directory.GetCurrentDirectory() + "\\log\\info";

            if (!Directory.Exists(sqlPath))
            {
                DirectoryInfo di = Directory.CreateDirectory(sqlPath);
            }

            var logFilePath = sqlPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
            lockSlim.EnterWriteLock();//打开写操作锁
            try
            {
                string TestText = i+DateTime.Now.ToString();
                File.AppendAllText(logFilePath, i + "\r\n");
            }
            finally
            {
                lockSlim.ExitWriteLock();//占用完后退出
            }
        }

        public static void ErroWriteFile(string i)
        {

            var sqlPath = System.IO.Directory.GetCurrentDirectory() + "\\log\\erro";

            if (!Directory.Exists(sqlPath))
            {
                DirectoryInfo di = Directory.CreateDirectory(sqlPath);
            }

            var logFilePath = sqlPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
            lockSlim.EnterWriteLock();//打开写操作锁
            try
            {
                string TestText = i + DateTime.Now.ToString();
                File.AppendAllText(logFilePath, i + "\r\n");
            }
            finally
            {
                lockSlim.ExitWriteLock();//占用完后退出
            }
        }
    }
}
复制代码

 

posted @   gds111789  阅读(137)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
历史上的今天:
2011-05-23 使用web服务
点击右上角即可分享
微信分享提示