c#学习, 封装一个简单的log工具类

612 阅读1分钟

背景

临时接到一个项目, 需要用到c#, 写一个winform的管理端, 为了自己调试跟踪程序流程方便, 所以封装了一个简单的log工具类.

代码

1. 接口

namespace Zoo.Log
{
    /// <summary>
    /// 接口
    /// </summary>
    public interface ILogHandler
    {
        public void Write(string msg);
    }
}

2. 接口实现

此处仅操作文本文件, 另外你也可以写其他实现(比如: redis, mysql)
using System;
using System.IO;

namespace Zoo.Log
{  
    /// <summary>
    /// 接口实现 - 使用文本文件
    /// </summary>
    public class LogHandler : ILogHandler
    {
        private static string fileName;
        private static string dirName;

        public LogHandler(string fileName = "")
        {
            // System.AppDomain.CurrentDomain.BaseDirectory 获取程序的基目录。
            // 设置日志保存目录
            dirName = System.AppDomain.CurrentDomain.BaseDirectory + "log";
            
            if (!Directory.Exists(dirName))
            {
                Directory.CreateDirectory(dirName);
            }

            if (fileName == null || fileName.Length < 1)
            {
                fileName = "clear_car_" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
            }

            LogHandler.fileName = fileName; 
        }      

        public void Write(string msg)
        {
            // public StreamWriter (string path, bool append);
            using StreamWriter writer = new(Path.Combine(dirName, LogHandler.fileName), true);
            writer.WriteLine(msg);
        }
    }
}

3. 应用类

using System;
using System.IO;

namespace Zoo.Log
{
    /// <summary>
    /// 应用类
    /// </summary>
    public class Log
    {
        /// <summary>
        /// 静态变量的初始值是(默认值)变量类型的默认值。
        /// 出于明确赋值检查的目的,静态变量被视为初始赋值。
        /// </summary>
        private static LogHandler logHandler;
        private static string fileName;
        
        private static void Write(int level, string msg)
        {
            if (Log.logHandler == null)
            {
                Log.logHandler = new LogHandler(Log.fileName);
            }

            string tmp = "[" + DateTime.Now + "]";
            tmp = tmp + "[" + Log.GetLevelStr(level) + "]";
            tmp += msg;

            logHandler.Write(tmp);
        }

        private static string GetLevelStr(int level)
        {
            switch (level)
            {
                case 1:
                    return "debug";
                case 2:
                    return "info"; 
                case 4:
                    return "warn"; 
                case 8:
                    return "error";  
            }

            return "unknown";
        }

        public static void SetHandle(string fileName)
        {
            Log.fileName = fileName;
        }

        public static void DEBUG(string msg)
        {
            Log.Write(1, msg);
        }
        public static void INFO(string msg)
        {
            Log.Write(2, msg);
        }
        public static void WARN(string msg)
        {
            Log.Write(4, msg);
        }
        public static void ERROR(string msg)
        {
            Log.Write(8, msg);
        }
    }
}

4. 调用

在需要加日志的地方直接调用:

Log.DEBUG("这里是调试1");

先设置日志文件, 再调用:

Log.SetHandle("test.txt");
Log.DEBUG("这里是调试1");