【基类库】日志类,多线程多程序同时使用不冲突

原创 QingShanNET  2017-11-10 09:48:21  阅读 98 次 评论 0 条

最近在开发微信公众号,需要输出日志之类的东西,后来发现公司的框架跟log.NET有冲突,就搜索了相关的资料,写了一个日志类,多线程多程序不冲突。

代码展示

/*
 * 日志类,不同于其他开源项目需要引用dll 
 * 代码简短,支持多线程写同一日志文件不冲突。
 * 主要代码也来自网络,进行过优化和格式修改
 * QingShanKing 
 * 博客:https://www.xsyrz.cn
 * 微博:https://weibo.com/yanqingshan
 * 企鹅:381318751
 */
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
 
 
namespace WeiXinLibrary
{
    public class loghelper
    {
        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);
        }
    }
}

备注

每2M大小会自动分文件保存

代码下载

高速下载

本文地址:https://www.xsyrz.cn/course/Code-loghelper.html
版权声明:本文为原创文章,版权归 QingShanNET 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?