C# 异步日志记录类,方便下次使用,不用重复造轮子

先定义接口类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 异常
{
    internal interface ILog
    {
        Task WriteErrorLog(string message);

        Task WriteInfoLog(string message);

        Task WriteLog(string logType, string message);
    }
}

在去实现:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 异常
{
    internal class Log : ILog
    {
        public string LogDirectory { get; set; }
        public string TimeDirName { get; set; }

        private  string LogFileName { get; set; }

        private const long maxLogSize = 2*1024*1024; // 2 MB

        private string FirstLogFileName { get; set; }
        public Log() 
        {
            //在根目录创建Log文件夹
            IOTools.CreatLogDir("Log");
            //初始化
            LogDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Log");
            TimeDirName = DateTime.Now.ToString("yyyyMMdd");
            FirstLogFileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";
        }
        public async Task WriteErrorLog(string message)
        {
             await WriteLog("Error",message);
        }

        public async Task WriteInfoLog(string message)
        {
            await WriteLog("Info", message);
        }

        public async Task WriteLog(string logType ,string message)
        {
            //创建文件夹
            string dirType = TimeDirName + "\\" + logType;
            IOTools.CreatDir(dirType, LogDirectory);
            LogFileName=Path.Combine(LogDirectory, dirType, FirstLogFileName);
            if (!File.Exists(LogFileName))
            {
                using (StreamWriter sw = File.CreateText(LogFileName))
                {
                   await sw.WriteLineAsync($"【{logType}{DateTime.Now} \r\n {message}  \r\n \r\n");
                }
            }
            else
            {
                FileInfo fileInfo = new FileInfo(LogFileName);
                if (fileInfo.Length > maxLogSize)
                {
                    string newFileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";
                    LogFileName = Path.Combine(LogDirectory, dirType, newFileName);
                    using (StreamWriter sw = File.CreateText(LogFileName))
                    {
                        await sw.WriteLineAsync($"【{logType}{DateTime.Now} \r\n {message}  \r\n \r\n");
                    }
                }
                else
                {
                    using (StreamWriter sw = File.AppendText(LogFileName))
                    {
                        await sw.WriteLineAsync($"【{logType}{DateTime.Now} \r\n {message}  \r\n \r\n");
                    }
                }
            }
        }


    }
}

工具类:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace 异常
{
    internal  class IOTools
    {
        public static void CreatLogDir(string name)
        {
            string rootDirectory = Directory.GetCurrentDirectory();
            CreatDir(name, rootDirectory);
        }

        public static void CreatDir(string name , string path)
        {
            if(string.IsNullOrEmpty(name)) throw new ArgumentNullException("name");
            if(string.IsNullOrEmpty(path)) throw new ArgumentNullException("path");
            string logPath = Path.Combine(path, name);
            // 判断文件夹是否存在
            if (!Directory.Exists(logPath))
            {
                // 在当前项目根目录创建一个新的文件夹
                Directory.CreateDirectory(logPath);
            }

        }
    }
}

最后实现的效果,简洁明了
如图:

C# 异步日志记录类,方便下次使用,不用重复造轮子_第1张图片
C# 异步日志记录类,方便下次使用,不用重复造轮子_第2张图片
C# 异步日志记录类,方便下次使用,不用重复造轮子_第3张图片
C# 异步日志记录类,方便下次使用,不用重复造轮子_第4张图片

你可能感兴趣的:(C#异步编程,c#,开发语言)