C#轻量多线程log库

最近总结了下之前写的C#log库,源码如下:分为两个文件

//LogInfo.cs
public class LogInfo
    {
        /// 日志文件大小
        private int fileSize;

        /// 日志文件的路径
        private string fileLogPath;

        /// 日志文件的名称
        private string logFileName;

        /// 构造函数,初始化日志文件大小[2M]

        /// 可以使用相关属性对其进行更改.

        public LogInfo(string logName)
        {

            this.fileSize = 10 * 1024 * 1024;//2M

            //默认路径

            this.fileLogPath = Directory.GetCurrentDirectory();// + @"\log\";//路径,可以根据实际修改

            string nameTime = DateTime.Now.ToString("yyyy-MM-dd");

            this.logFileName = System.Environment.MachineName + nameTime + logName + ".txt";
        }

        /// 获取或设置定义日志文件大小
        public int FileSize
        {
            set
            {
                fileSize = value;
            }
            get
            {
                return fileSize;
            }
        }
        /// 获取或设置日志文件的路径
        public string FileLogPath
        {
            set
            {
                this.fileLogPath = value;
            }
            get
            {
                return this.fileLogPath;
            }
        }
        /// 获取或设置日志文件的名称
        public string LogFileName
        {
            set
            {
                this.logFileName = value;
            }
            get
            {
                return this.logFileName;
            }

        }
        /// <summary>
        /// 向指定目录中的指定的文件中追加日志文件
        /// <param name="Message">Message,要写入日志的内容</param>
        /// </summary>
        public void WriteLog(string Message)
        {
            this.m_WriteLog(this.logFileName, Message);
        }



        int cnt = 1;
        /// <summary>
        /// 向指定目录中的文件中追加日志文件,日志文件的名称将由传递的参数决定.
        /// <param name="LogFileName">日志文件的名称,如:mylog.txt ,如果没有自动创建,如果存在将追加写入日志</param>
        /// <param name="Message">Message,要写入日志的内容</param>
        /// </summary>
        private void m_WriteLog(string LogFileName, string Message)
        {

            //如果日志文件目录不存在,则创建
            if (!Directory.Exists(this.fileLogPath))
            {
                Directory.CreateDirectory(this.fileLogPath);
            }
            //static int cnt = 1;
            FileInfo finfo = new FileInfo(this.fileLogPath + LogFileName);
            if (finfo.Exists && finfo.Length > fileSize)
            {
                finfo.MoveTo(this.fileLogPath + LogFileName + "_bk_" + cnt.ToString());
            }
            try
            {
                FileStream fs = new FileStream(this.fileLogPath + LogFileName, FileMode.Append);
                StreamWriter strwriter = new StreamWriter(fs);
                try
                {
                    string tm = DateTime.Now.ToString("HH:mm:ss:fff");
                    strwriter.WriteLine("[" + tm + "]" + Message);
                    strwriter.Flush();
                }
                catch (Exception ee)
                {
                    //Console.WriteLine("日志文件写入失败信息:" + ee.ToString());
                    using (FileStream efs = new FileStream("./error.txt", FileMode.Append))
                    {
                        byte[] data = System.Text.Encoding.Default.GetBytes(ee.Message);
                        efs.Write(data, 0, data.Length);
                    }
                }
                finally
                {
                    strwriter.Close();
                    strwriter = null;
                    fs.Close();
                    fs = null;
                }
            }
            catch (Exception ee)
            {
                //Console.WriteLine("日志文件没有打开,详细信息如下:" + ee.ToString());
                using (FileStream efs = new FileStream("./error.txt", FileMode.Append))
                {
                    byte[] data = System.Text.Encoding.Default.GetBytes("日志文件没有打开,详细信息如下:" + ee.Message);
                    efs.Write(data, 0, data.Length);
                }
            }
        }
    }

class LogMgr

//LogMgr.cs 
   public class LogMgr
    {
        /// <summary>
        /// 初始化log文件名
        /// </summary>
        /// <param name="name"></param>
        public LogMgr(string name)
        {
            logInfo = new LogInfo(name);
            Start();
        }
        ~LogMgr()
        {
            Stop();
            if (th != null) th.Abort();
        }

        private readonly object mutex = new object();
        Queue<string> qlog = new Queue<string>();
        AutoResetEvent evt_log = new AutoResetEvent(false);
        LogInfo logInfo;// = new LogInfo("Info");

        void log2file()
        {
            while (isllog)
            {
                evt_log.WaitOne();

                while (qlog.Count > 0)
                {
                    lock (mutex)
                    {
                        logInfo.WriteLog(qlog.Dequeue());
                    }
                }

            }
        }


        /// <summary>
        /// Deprecated
        /// </summary>
        /// <param name="log"></param>
        public void FastLog(List<string> log)
        {
            lock (mutex)
            {
                foreach (var item in log)
                {
                    qlog.Enqueue(DateTime.Now.ToString("HH:mm:ss:fff") + " | " + "Info:" + item);
                }
            }
            evt_log.Set();//通知打印线程
        }
        Thread th;
        bool isllog = true;

        /// <summary>
        /// 停止log
        /// </summary>
        private void Stop()
        {
            isllog = false;
            if (th.ThreadState == ThreadState.Running || th.ThreadState == ThreadState.WaitSleepJoin)
                th.Abort();

        }
        
        /// <summary>
        /// 启动log服务线程
        /// </summary>
        void Start()
        {
            isllog = true;
            th = new Thread(new ThreadStart(log2file));
            th.IsBackground = true;
            th.Start();

        }
//public interface
        public void LogInfo(string str)
        {
            lock (mutex)
            {
                qlog.Enqueue(DateTime.Now.ToString("HH:mm:ss:fff") + " | " + "Info:" + str);
            }
            evt_log.Set();//通知打印线程
        }
        public void LogError(string str)
        {
            lock (mutex)
            {
                qlog.Enqueue(DateTime.Now.ToString("HH:mm:ss:fff") + " | " + "Error:" + str);
            }
            evt_log.Set();//通知打印线程
        }
        public void LogDebug(string str)
        {
            lock (mutex)
            {
                qlog.Enqueue(DateTime.Now.ToString("HH:mm:ss:fff") + " | " + "Debug:" + str);
            }
            evt_log.Set();//通知打印线程
        }
    }

使用方法:

            LogMgr log = new LogMgr("info.txt");
            log.LogInfo("this is info log");

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值