C#搬砖日常之写个LogManager类

这篇博客介绍了如何使用C#编写一个日志管理类LogManager,包括配置文件设置日志路径和类型,创建日志枚举,以及实现日志写入方法。通过缓存策略提升写入效率,根据日志等级配置控制输出。建议将LogManager封装到独立DLL以减少依赖冲突。

程序语言C#,用于写日志,日志文件长度为1M,超过1M自动创建新文件。

日志目录
日志记录

1.文件配置

在Web.config 的<appSetting></appSetting>中增加LogFilePath及LogType设置,分别用于配置日志存放目录及日志类型

    <add key="LogFilePath" value="Log" />
    <!--Info1 Debug2 Error3-->
    <add key="LogType" value="Error3" />
![配置文件](https://img-blog.csdnimg.cn/9e2b52bcd50a4b238322b4a96b27efb7.png)

2.创建日志类型枚举类型

    public enum LogTypeEnum
    {
        Info1 = 1,
        Debug2 = 2,
        Error3 = 3,
    }

3.创建日志类LogManager

3.1 日志路径获取

3.1.1 添加引用

添加配置文件操作引用以及IO类引用

using System.Configuration;
using System.IO;

3.1.2 获取路径配置

利用ConfigurationManager.AppSettings[“LogFilePath”]获取路径配置

        public static string LogPath = (ConfigurationManager.AppSettings["LogFilePath"].IndexOf(":") < 0) ? Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConfigurationManager.AppSettings["LogFilePath"]) : ConfigurationManager.AppSettings["LogFilePath"];

3.1.3 配置缓存时间

定义一个时间变量,用于缓存日志写入时间,减少写日志频率,提升效率

        private static DateTime RefreshManagerTime = DateTime.Now;

定义一个LogTypeEnum类型的成员OutLogType,用于获取日志写入等级,这里可以根据日志配置的等级来判断是否写入日志记录。
这个配置是为了调试和发布方便,例如一些查看sql、查看接口成员、登录信息的日志可以配置为Info1等级;一些调试的输出可以配置为Debug2等级,一些异常和错误判断日志配置为Debug2等级。在配置文件中配置为Info1时,日志全部输出;配置为Debug2时,仅输出Debug2日志和Error3日志;配置为Error3时,仅输出错误日志。在我们测试环境配置为Infor1或Debug2等级方便我们进行错误定位,在正式环境修改为Error3,则会仅记录错误日志,从而减少正式环境服务器存储压力。

        public static LogTypeEnum OutLogType
        {
            get
            {
                if ((DateTime.Now - RefreshManagerTime).TotalSeconds > 600)
                {
                    ConfigurationManager.RefreshSection("appSettings");
                    RefreshManagerTime = DateTime.Now;
                }
                string _logType = ConfigurationManager.AppSettings["LogType"];
                if (string.IsNullOrEmpty(_logType))
                {
                    return LogTypeEnum.Error3;
                }
                else
                {
                    LogTypeEnum retValue = LogTypeEnum.Error3;
                    try { retValue = (LogTypeEnum)Enum.Parse(typeof(LogTypeEnum), _logType); }
                    catch { retValue = LogTypeEnum.Error3; }
                    return retValue;
                }
            }
        }

3.2 编写调用方法WriteLog

WriteLog方法定义静态方法,要求接收错误信息,日志类型

       public static void WriteLog(string errorMessage, LogTypeEnum logType = LogTypeEnum.Error3)
        {
            if (OutLogType > logType)
            {
                return;
            }
            string fileName = "Log.txt";
            StreamWriter sr;
            string filePath = Path.Combine(LogPath, fileName);
            if (File.Exists(filePath))
            {

                FileInfo fileInfo = new FileInfo(filePath);
                //文件大于1M新建日志文件
                if (fileInfo.Length >= 1024 * 1024)
                {
                    int i = 1;
                    string bkFileName = string.Empty;
                    while (true)
                    {
                        bkFileName = string.Format("{0}{1}{2}{3}", fileName.Substring(0, fileName.LastIndexOf('.')), "-", i, fileName.Substring(fileName.LastIndexOf('.')));
                        if (!File.Exists(Path.Combine(LogPath, bkFileName)))
                        {
                            break;
                        }
                        i++;
                    }
                    fileInfo.MoveTo(Path.Combine(LogPath, bkFileName));

                    if (!Directory.Exists(LogPath))
                    {
                        DirectoryInfo di = new DirectoryInfo(LogPath);
                        di.Create();

                    }
                    sr = File.CreateText(filePath);
                    sr.Write("时间: ");
                    sr.WriteLine(DateTime.Now);
                    sr.Write("错误: ");
                    sr.WriteLine(errorMessage);
                    sr.WriteLine("---------------------------------------------------");

                }
                else
                {

                    sr = File.AppendText(filePath);
                    sr.Write("时间: ");
                    sr.WriteLine(DateTime.Now);
                    sr.Write("错误: ");
                    sr.WriteLine(errorMessage);
                    sr.WriteLine("---------------------------------------------------");
                }
            }
            else //如果文件不存在
            {
                DirectoryInfo di = new DirectoryInfo(LogPath);
                di.Create();
                sr = new StreamWriter(filePath, true);
                sr.Write("时间: ");
                sr.WriteLine(DateTime.Now);
                sr.Write("错误: ");
                sr.WriteLine(errorMessage);
                sr.WriteLine("---------------------------------------------------");
            }
            sr.Close();
        }

3.2.1 增加 WriteLog方法的多种参数及返回类型

这里为了方便我们调用时方便操作,可以多些几种调用方法,具体如下

        public static Exception WriteLog(Exception ex, LogTypeEnum logType = LogTypeEnum.Error3)
        {
            if (OutLogType > logType)
            {
                return null;
            }
            string fileName = "Log.txt";
            StreamWriter sr;
            string filePath = Path.Combine(LogPath, fileName);

            if (File.Exists(filePath))
            {

                FileInfo fileInfo = new FileInfo(filePath);
                //文件大于1M新建日志文件
                if (fileInfo.Length >= 1024 * 1024)
                {
                    int i = 1;
                    string bkFileName = string.Empty;
                    while (true)
                    {
                        bkFileName = string.Format("{0}{1}{2}{3}", fileName.Substring(0, fileName.LastIndexOf('.')), "-", i, fileName.Substring(fileName.LastIndexOf('.')));
                        if (!File.Exists(Path.Combine(LogPath, bkFileName)))
                        {
                            break;
                        }
                        i++;
                    }
                    fileInfo.MoveTo(Path.Combine(LogPath, bkFileName));

                    if (!Directory.Exists(LogPath))
                    {
                        DirectoryInfo di = new DirectoryInfo(LogPath);
                        di.Create();

                    }
                    sr = File.CreateText(filePath);
                    sr.Write("时间: ");
                    sr.WriteLine(DateTime.Now);
                    sr.Write("错误: ");
                    sr.WriteLine(ex.Message);
                    sr.Write("错误堆栈分析: ");
                    sr.WriteLine(ex.StackTrace);
                    sr.WriteLine("---------------------------------------------------");

                }
                else
                {
                    sr = File.AppendText(filePath);
                    sr.Write("时间: ");
                    sr.WriteLine(DateTime.Now);
                    sr.Write("错误: ");
                    sr.WriteLine(ex.Message);
                    sr.Write("错误堆栈分析: ");
                    sr.WriteLine(ex.StackTrace);
                    sr.WriteLine("---------------------------------------------------");

                }

            }
            else //如果文件不存在
            {
                if (!Directory.Exists(LogPath))
                {
                    DirectoryInfo di = new DirectoryInfo(LogPath);
                    di.Create();

                }
                sr = File.CreateText(filePath);
                sr.Write("时间: ");
                sr.WriteLine(DateTime.Now);
                sr.Write("错误: ");
                sr.WriteLine(ex.Message);
                sr.Write("错误堆栈分析: ");
                sr.WriteLine(ex.StackTrace);
                sr.WriteLine("---------------------------------------------------");
            }
            sr.Close();

            return ex;
        }
        public static void WriteLog(Exception ex, string ErrorMessage, LogTypeEnum logType = LogTypeEnum.Error3)
        {
            if (OutLogType > logType)
            {
                return;
            }
            string fileName = "Log.txt";
            StreamWriter sr;
            string filePath = Path.Combine(LogPath, fileName);

            if (File.Exists(filePath))
            {

                FileInfo fileInfo = new FileInfo(filePath);
                //文件大于1M新建日志文件
                if (fileInfo.Length >= 1024 * 1024)
                {
                    int i = 1;
                    string bkFileName = string.Empty;
                    while (true)
                    {
                        bkFileName = string.Format("{0}{1}{2}{3}", fileName.Substring(0, fileName.LastIndexOf('.')), "-", i, fileName.Substring(fileName.LastIndexOf('.')));
                        if (!File.Exists(Path.Combine(LogPath, bkFileName)))
                        {
                            break;
                        }
                        i++;
                    }
                    fileInfo.MoveTo(Path.Combine(LogPath, bkFileName));

                    if (!Directory.Exists(LogPath))
                    {
                        DirectoryInfo di = new DirectoryInfo(LogPath);
                        di.Create();

                    }
                    sr = File.CreateText(filePath);
                    sr.Write("时间: ");
                    sr.WriteLine(DateTime.Now);
                    sr.Write("错误: ");
                    sr.WriteLine(ErrorMessage);
                    sr.Write("错误堆栈分析: ");
                    sr.WriteLine(ex.StackTrace);
                    sr.WriteLine("---------------------------------------------------");

                }
                else
                {
                    sr = File.AppendText(filePath);
                    sr.Write("时间: ");
                    sr.WriteLine(DateTime.Now);
                    sr.Write("错误: ");
                    sr.WriteLine(ErrorMessage);
                    sr.Write("错误堆栈分析: ");
                    sr.WriteLine(ex.StackTrace);
                    sr.WriteLine("---------------------------------------------------");

                }

            }
            else //如果文件不存在
            {
                if (!Directory.Exists(LogPath))
                {
                    DirectoryInfo di = new DirectoryInfo(LogPath);
                    di.Create();

                }
                sr = File.CreateText(filePath);
                sr.Write("时间: ");
                sr.WriteLine(DateTime.Now);
                sr.Write("错误: ");
                sr.WriteLine(ErrorMessage);
                sr.Write("错误堆栈分析: ");
                sr.WriteLine(ex.StackTrace);
                sr.WriteLine("---------------------------------------------------");
            }
            sr.Close();
        }

        public static void WriteLog(string errorMessage, LogTypeEnum logType = LogTypeEnum.Error3, params string[] paras)
        {
            WriteLog(string.Format(errorMessage, paras), logType);
        }

4.调用写日志

在需要调用日志的地方将类的命名空间引入,并直接使用如下方法进行调用

                        LogManager.WriteLog("此处为错误信息", LogTypeEnum.Error3);

或在try…catch(Exception ex)中这样调用

                return LogManager.WriteLog(ex, LogTypeEnum.Error3);

其他的调用方法类似,再此不在赘述。

5.总结

本文仅仅使用到配置文件对日志路径及错误等级进行配置,利用System.IO的文件读写操作进行日志输出。将日志输出进行了封装,方便调用。建议将LogManger放在独立的dll中封装,以便在需要的Dll中进行引用,避免Dll引用的依赖冲突。
LogManger类的位置

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

informationchina

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

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

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

打赏作者

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

抵扣说明:

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

余额充值