C# 日志操作类,控制多线程写入

c#项目日志记录类,可以多线程写入

using System;
using System.Web;
using System.IO;
using System.Threading;

namespace PerformSystem.Tools
{
    public class LogTool
    {
        //日志类型
        public enum LogType : int
        {
            DEBUG = 0,
            INFO = 1,
            ERROR = 2
        }

        //日志目录
        private static string Path = HttpContext.Current.Server.MapPath("~/Logs/");

        //日志登记 0:所有 1:系统信息与错误信息 2:错误信息
        private static int LOGLEVEL = 0;

        //读写锁,锁定文件写入权限,每个线程依次等待上个写入完成
        static ReaderWriterLockSlim LogWriteLock = new ReaderWriterLockSlim();

        public static void Write(LogType type, string logInfo)
        {
            try
            {
                //设置读写锁为写入模式独占资源
                //因写入模式的进入与释放在同一个代码块内,请保证在块内进入写入模式前不会触发异常,否则会因为进入与释放次数不符从而触发异常
                //请勿长时间占用读写锁否则会导致其他线程饥饿。
                LogWriteLock.EnterWriteLock();
                if (LOGLEVEL == 1 && type == LogType.DEBUG)
                    return;
                if (LOGLEVEL == 1 && (type == LogType.DEBUG || type == LogType.INFO))
                    return;
                //日志文件名称,每天一个
                string filename = "Log_" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                //不存在目录则创建
                if (!Directory.Exists(Path))
                {
                    Directory.CreateDirectory(Path);
                }
                //不存在文件则创建
                if (!File.Exists(Path + filename))
                {
                    File.Create(Path + filename).Close();
                }
                using (FileStream file = new FileStream(Path + filename, FileMode.Append, FileAccess.Write))
                {
                    using (StreamWriter sw = new StreamWriter(file))
                    {
                        sw.WriteLine("日志类型:{0}", type == LogType.DEBUG ? "调试日志" : (type == LogType.INFO ? "系统信息" : "错误日志"));
                        sw.WriteLine("日志时间:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                        sw.WriteLine("日志信息:{0}", logInfo);
                        sw.WriteLine("-----------------------------------------------------------------------------------俺是一条分割线----------------------------------\n");
                        sw.Dispose();
                    }
                    file.Close();
                }
            }
            catch (Exception)
            {
            }
            finally
            {
                //退出写入模式,释放资源占用
                //注意释放与进入次数相同否则会触发异常
                LogWriteLock.ExitWriteLock();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Drumsticks

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值