.net core 编写日志类

using System;
using System.IO;

namespace WebApplication2.Controllers
{
    public static class LogExtentsions
    {
        private static string currentDay = string.Empty;//当前时间
        private static object lockHelper = new object();//锁对象
        /// <summary>
        /// 延时初始化,文件路径
        /// </summary>
        private static Lazy<string> filePath = new Lazy<string>(delegate ()
        {
            //AppDomain.CurrentDomain:当前应用程序域
            //AppDomain.CurrentDomain.BaseDirectory: 基目录,由程序集冲突解决程序用来探测程序集。
            string tmpPath = AppDomain.CurrentDomain.BaseDirectory;
            var path = Path.Combine(tmpPath, "Logs");//将两个字符串拼接成一个路径
            if (!System.IO.Directory.Exists(path))//如果路径不存在
            {
                System.IO.Directory.CreateDirectory(path);//创建路径
            }
            return path;
        }, System.Threading.LazyThreadSafetyMode.ExecutionAndPublication);//锁住进程,放置重复添加文件
        public static string Prefix = string.Empty;

        /// <summary>
        /// 写入日志
        /// </summary>
        /// <param name="info">日志内容</param>
        /// <param name="title">日志标题</param>
        /// <param name="logpath">日志路径</param>
        /// <param name="encoding">内容编码</param>
        public static void WriteLine(string info, string title = null, string logpath = null, string encoding = null) {
            if (string.IsNullOrWhiteSpace(info))//判断内容是否为空,如果为空就直接返回
            {
                return;
            }
            
            var tmpDay = DateTime.Now.ToString("yyyyMMdd");//当前时间转年月日字符串
            var tmpPath = Path.Combine(filePath.Value, tmpDay);//拼接路径,当前应用程序路径加上+logs,+年月日
            if (Directory.Exists(tmpPath)==false)//目录不存在
            {
                Directory.CreateDirectory(tmpPath);//创建目录
            }
            //var isTitleEmpty = string.IsNullOrWhiteSpace(title);//日志标题是否为空
            string logfilepath;
            var logFileName = "";
            //if (isTitleEmpty)//如果日志标题为空,则目录拼接年月日.log
            //{
            //    logfilepath = Path.Combine(tmpPath, Prefix + tmpDay + ".log");
            //}
            //else {
            //    logfilepath = Path.Combine(tmpPath, title + ".log");//用户传了目录信息则在年月日目录下面创建标题.log文件
            //}
            //如果标题字段有内容则标题.log,如果标题字段没有内容则日期+log
            logFileName = (title == null ? "" : title) == "" ? (tmpDay + ".log") : title + ".log";
            if (!string.IsNullOrWhiteSpace(logpath))
            {
                var logpathSrc = Path.Combine(tmpPath,logpath);//拼接用户传进来的目录
                if (!Directory.Exists(logpathSrc))//如果用户传进来的目录不存在
                {
                    Directory.CreateDirectory(logpathSrc);
                }
                logfilepath = Path.Combine(tmpPath, logpath, logFileName);//拼接应用程序日志路径,用户自定义路径,文件名称
            }
            else {
                logfilepath = Path.Combine(tmpPath, logFileName);
            }
            var tmpText = string.Concat(DateTime.Now.ToString(), ":", "\r\n", info.ToString());//内容拼接,时间:换行,用户传的信息
            var tmpLogInfo = new string[] { logfilepath, tmpText, encoding };
            lock (lockHelper)//锁住线程
            {
                try
                {
                    //tmpLogInfo[0]-logfilepath路径,FileMode.Append:如果目录文件存在则追加,否则创建文件,FileAccess.Write:文件写权限
                    using (FileStream fileStream=new FileStream(tmpLogInfo[0],FileMode.Append,FileAccess.Write))
                    {
                        if (!string.IsNullOrWhiteSpace(tmpLogInfo[2]))
                        {
                            using (StreamWriter streamWrite = new StreamWriter(fileStream, System.Text.Encoding.GetEncoding(tmpLogInfo[2])))
                            {
                                streamWrite.WriteLine(tmpLogInfo[1]);
                                streamWrite.WriteLine();
                                streamWrite.Flush();//清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流。

                            }
                        }
                        else {
                            using (StreamWriter streamWrite = new StreamWriter(fileStream))
                            {
                                streamWrite.WriteLine(tmpLogInfo[1]);
                                streamWrite.WriteLine();
                                streamWrite.Flush();//清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流。
                            }
                        }
                      
                    }
                }
                catch (Exception ex)
                {
                    // 异常:
                    //   T:System.ObjectDisposedException:
                    //     当前编写器已关闭。
                    //
                    //   T:System.IO.IOException:
                    //     发生了 I/O 错误。
                    //
                    //   T:System.Text.EncoderFallbackException:
                    //     当前编码不支持显示半个 Unicode 代理项对。
                    Console.WriteLine("录入日志异常:" + ex.Message);
                }
            }
        }
    }
}

 

posted @ 2021-03-10 17:13  厚颜无耻之徒  阅读(151)  评论(0编辑  收藏  举报