C#开发日志工具类

cs 复制代码
namespace Log.Utils
{
    public class TextLogUtil
    {
        private static readonly object locker = new object();
        private static StreamWriter sw;
        private static Timer changePathTimer;
        private static readonly int CHANGEPATHINTERVAL = 60 * 1000;
        private static readonly string LOGFILENAMEFORMAT = "yyyyMMdd_HH";
        private static readonly string LOGLINEFORMAT = "HH:mm:ss_ffff";
        private static LogLevel logLevel;

        static TextLogUtil()
        {
            changePathTimer = new Timer(state =>
            {
                lock (locker)
                {
                    Close();
                    InitStreamWriter();
                }
            }, null, CHANGEPATHINTERVAL, CHANGEPATHINTERVAL);
            InitStreamWriter();
        }

        #region internal
        internal static void Close()
        {
            try
            {
                if (sw != null)
                    sw.Close();
            }
            catch
            {
            }
        }
        #endregion

        #region private

        private static void InitStreamWriter()
        {
            logLevel = LogLevel.Debug;
            try
            {
                sw = new StreamWriter(GetLogFileName(), true, Encoding.UTF8, 1024);
                sw.AutoFlush = true;
            }
            catch
            {
            }
        }

        private static string GetLogFileName()
        {
            string path = Path.Combine(ConfigurationManager.AppSettings["FileLogPath"] ?? AppDomain.CurrentDomain.BaseDirectory, "Log");
            if (!Directory.Exists(path)) Directory.CreateDirectory(path);
            string file = DateTime.Now.ToString(LOGFILENAMEFORMAT) + ".txt";
            return Path.Combine(path, file);
        }

        private static void Log(LogLevel logLevel, string format, params object[] args)
        {
            Log(logLevel, string.Format(format, args));
        }

        private static string WrapWithContext(LogLevel logLevel, string s)
        {
            StackTrace strackTrace = new StackTrace();
            StackFrame[] stackFrames = strackTrace.GetFrames();
            StackFrame stackFrame = null;
            for (int i = 0; i < stackFrames.Length; i++)
            {
                if (stackFrames[i].GetMethod().ReflectedType != typeof(TextLogUtil))
                {
                    stackFrame = stackFrames[i];
                    break;
                }
            }

            MethodBase methodBase = stackFrame.GetMethod();
            string method = string.Format("{0} {1}()", methodBase.DeclaringType.FullName, methodBase.Name);

            return string.Format("[{0}] @{1} #{2} {3} - {4}",
                logLevel,
                DateTime.Now.ToString(LOGLINEFORMAT),
                Thread.CurrentThread.ManagedThreadId,
                method, s);
        }

        #endregion

        #region public

        public static void Debug(string s)
        {
            if ((int)logLevel <= (int)LogLevel.Debug)
                Log(LogLevel.Debug, s);
        }

        public static void Debug(string format, params object[] args)
        {
            if ((int)logLevel <= (int)LogLevel.Debug)
                Log(LogLevel.Debug, format, args);
        }

        public static void Info(string s)
        {
            if ((int)logLevel <= (int)LogLevel.Info)
                Log(LogLevel.Info, s);
        }

        public static void Info(string format, params object[] args)
        {
            if ((int)logLevel <= (int)LogLevel.Info)
                Log(LogLevel.Info, format, args);
        }

        public static void Warning(string s)
        {
            if ((int)logLevel <= (int)LogLevel.Warning)
                Log(LogLevel.Warning, s);
        }

        public static void Warning(string format, params object[] args)
        {
            if ((int)logLevel <= (int)LogLevel.Warning)
                Log(LogLevel.Warning, format, args);
        }

        public static void Error(string s)
        {
            if ((int)logLevel <= (int)LogLevel.Error)
                Log(LogLevel.Error, s);
        }

        public static void ErrorWithException(string s, Exception ex)
        {
            if ((int)logLevel <= (int)LogLevel.Error)
                Log(LogLevel.Error, s);

            if (ex.InnerException != null)
            {
                Log(LogLevel.Error, "(InnerException):" + ex.InnerException.Message);
            }
        }

        public static void Error(string format, params object[] args)
        {
            if ((int)logLevel <= (int)LogLevel.Error)
                Log(LogLevel.Error, format, args);
        }

        public static void Log(LogLevel logLevel, string s)
        {
            //return;
            try
            {

                lock (locker)
                {
                    var message = WrapWithContext(logLevel, s);
#if DEBUG
                    switch (logLevel)
                    {
                        case LogLevel.Debug:
                            Console.ForegroundColor = ConsoleColor.Gray;
                            break;
                        case LogLevel.Info:
                            Console.ForegroundColor = ConsoleColor.White;
                            break;
                        case LogLevel.Warning:
                            Console.ForegroundColor = ConsoleColor.Yellow;
                            break;
                        case LogLevel.Error:
                            Console.ForegroundColor = ConsoleColor.Red;
                            break;
                    }
                    Console.WriteLine(message);
                    Console.ResetColor();
#endif
                    sw.WriteLine(message);
                }
            }
            catch
            {
            }
        }
        #endregion
    }


    public enum LogLevel
    {

        /// <summary>
        /// 无
        /// </summary>
        None = 99,
        /// <summary>
        /// 调试
        /// </summary>
        Debug = 1,
        /// <summary>
        /// 信息
        /// </summary>
        Info = 2,
        /// <summary>
        /// 警告
        /// </summary>
        Warning = 3,
        /// <summary>
        /// 轻微
        /// </summary>
        Slight = 4,
        /// <summary>
        /// 一般
        /// </summary>
        Error = 5,
        /// <summary>
        /// 严重
        /// </summary>
        Serious = 6,
        /// <summary>
        /// 致命
        /// </summary>
        Exception = 7
        //Trace, Debug, Information, Warnning, Error, Fatal 
    }
}
相关推荐
qq_2131578914 分钟前
(c#)unity中sqlite多线程同时开启事务会导致非常慢
数据库·sqlite·c#
VXbishe27 分钟前
(附源码)基于springboot的“我来找房”微信小程序的设计与实现-计算机毕设 23157
java·python·微信小程序·node.js·c#·php·课程设计
Sliphades2 小时前
多文件并发多线程MD5工具(相对快速的MD5一批文件),适配自定义MD5 Hash I/O缓存。
c#
weixin_464078073 小时前
wpf加载带材料的3D模型(下载的3D预览一样有纹理)
c#·wpf
赛男丨木子丿小喵4 小时前
Gridview配置数据源--信任服务器证书
c#
FL16238631294 小时前
[C#]C# winform部署yolov11-pose姿态估计onnx模型
开发语言·yolo·c#
无情大菜刀7 小时前
C# 雷赛运动控制器 SMC304 新建工程
c#
IT良15 小时前
c#增删改查 (数据操作的基础)
开发语言·c#
yufei-coder15 小时前
掌握 C# 中的 LINQ(语言集成查询)
windows·vscode·c#·visual studio
59678515420 小时前
DotNetty ChannelRead接收数据为null
tcp/ip·c#