苏飞论坛

标题: 日志类,多线程多程序同时写不冲突 。 [打印本页]

作者: wisecn    时间: 2017-1-13 09:27
标题: 日志类,多线程多程序同时写不冲突 。
[C#] 纯文本查看 复制代码
/*
* 日志类,不同于其他开源项目需要引用dll
* 代码简短,支持多线程写同一日志文件不冲突。
* 主要代码也来自网络,进行过优化和格式修改
* wisecn  2017-1-13
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;


namespace SXLibrary
{
    public class Log
    {
        private static readonly Thread WriteThread;
        private static readonly Queue<string> MsgQueue;
        private static readonly object FileLock;
        private static readonly string FilePath;

        static Log()
        {
            FileLock = new object();
            FilePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "log\\";
            WriteThread = new Thread(WriteMsg);
            WriteThread.IsBackground = true;
            MsgQueue = new Queue<string>();
            WriteThread.Start();
        }

        public static void WriteInfoLog(string msg)
        {
            Monitor.Enter(MsgQueue);
            MsgQueue.Enqueue(string.Format("{0}[{1}]{2}\r\n", " Info", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"), msg));
            Monitor.Exit(MsgQueue);
        }
        public static void WriteErrorLog(string msg)
        {
            Monitor.Enter(MsgQueue);
            MsgQueue.Enqueue(string.Format("{0}[{1}]{2}\r\n", "Error", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"), msg));
            Monitor.Exit(MsgQueue);
        }
        public static void WriteDebugLog(string msg)
        {
            Monitor.Enter(MsgQueue);
            MsgQueue.Enqueue(string.Format("{0}[{1}]{2}\r\n", "Debug", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"), msg));
            Monitor.Exit(MsgQueue);
        }
        private static void WriteMsg()
        {
            while (true)
            {
                if (MsgQueue.Count > 0)
                {
                    Monitor.Enter(MsgQueue);
                    string msg = MsgQueue.Dequeue();
                    Monitor.Exit(MsgQueue);

                    Monitor.Enter(FileLock);

                    string _path = FilePath + msg.Substring(0, 5).Trim() + "\\" + DateTime.Now.ToString("yyyy-MM");

                    if (!Directory.Exists(_path))
                    {
                        Directory.CreateDirectory(_path);
                    }
                    string fileName = _path + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
                    msg = msg.Remove(0, 5);
                    var logStreamWriter = new StreamWriter(fileName, true);
                    logStreamWriter.WriteLine(msg);
                    logStreamWriter.Close();
                    logStreamWriter.Dispose();
                    Monitor.Exit(FileLock);
                    if (GetFileSize(fileName) > 1024 * 2)
                    {
                        CopyToBak(fileName);
                    }
                }
                else
                {
                    System.Threading.Thread.Sleep(5);
                }

            }
        }


        private static long GetFileSize(string fileName)
        {
            long strRe = 0;
            if (File.Exists(fileName))
            {
                Monitor.Enter(FileLock);
                var myFs = new FileStream(fileName, FileMode.Open);
                strRe = myFs.Length / 1024;
                myFs.Close();
                myFs.Dispose();
                Monitor.Exit(FileLock);
            }
            return strRe;
        }
        private static void CopyToBak(string sFileName)
        {
            int fileCount = 0;
            string sBakName = "";
            Monitor.Enter(FileLock);
            do
            {
                fileCount++;
                sBakName = sFileName + "." + fileCount + ".BAK";
            }
            while (File.Exists(sBakName));

            File.Copy(sFileName, sBakName);
            File.Delete(sFileName);
            Monitor.Exit(FileLock);
        }
    }
}



补充内容 (2017-1-13 14:51):
每2M大小会自动分文件保存
作者: 客服~小小    时间: 2017-1-13 10:18
好东西
作者: 范范    时间: 2017-11-8 21:30
好东西,可以留用撒
作者: jinsling    时间: 2017-12-22 13:47
强烈支持楼主ing……
作者: 乖乖    时间: 2018-12-9 00:52
看过帖子回复一下是个好习惯
作者: huanter    时间: 2018-12-21 10:52
看过帖子回复一下是个好习惯
作者: ivan118    时间: 2018-12-21 21:28
嗯,我测试一下啊。
作者: jacksonwong    时间: 2019-5-31 17:06
我也测试一下!
作者: 641221621    时间: 2019-9-26 11:33
如何使用啊  兄弟!!!!!
作者: STONES    时间: 2019-11-4 15:34
来试试
作者: abc147325    时间: 2019-12-6 16:57
支持一下,好东西~~~




欢迎光临 苏飞论坛 (http://www.sufeinet.com/) Powered by Discuz! X3.4