C#(WPF) 日志管理

50 篇文章 18 订阅

实例链接:C#,WPF日志管理C#编程--项目常用日志保存-C#文档类资源-CSDN下载

日志管理类:

    /// <summary>
    /// 日志管理类
    /// </summary>
    public class AppLog
    {
        public static LogLevel Level = LogLevel.INFO;       //设置日志全局输出级别
        public static bool IsHourSplit = true;              //是否按小时拆分日志
        public static int MaxCacheCount = 1000;             //日志最大缓存数量
        public const string LogDirectory = "C:\\MyProject\\AppLog\\";
        private static AppLog gAppLog = null;
        public static AppLog Instance { get { if (gAppLog == null) gAppLog = new AppLog(); return gAppLog; } }
        private bool isClosed = false;
        private static bool isEnd = false;                  //一定用static  如果不是 在Release下卡在WaitWriteEnd函数
        private LogDataList outCacheList = new LogDataList();
        private Dictionary<string, LogDataList> outCacheDic = new Dictionary<string, LogDataList>();        //文件名称和日志列表键值对
        private static List<string> SubmitList = new List<string>();                                        //记录触发提交列表

        private static string GetFilePath(DateTime time, string fileName)
        {
            //fileName不包括扩展名
            string path = $"{LogDirectory}{time.Year}-{time.Month}-{time.Day}";
            if (!Directory.Exists(path))
                Directory.CreateDirectory(path);

            if (IsHourSplit)
                return path + $"\\{fileName}_" + time.Hour + ".txt";
            return path + $"\\{fileName}.txt";
        }

        public enum LogLevel
        {
            DEBUG,
            INFO,
            WARN,
            ERROR,
            FATAL,
        }

        private class LogData
        {
            public string m_site = string.Empty;
            public AppLog.LogLevel m_level = AppLog.LogLevel.INFO;
            public string m_message = string.Empty;
            public string m_fileName = "Log";
            public LogData(AppLog.LogLevel level, string message, string fileName, string site = "")
            {
                m_level = level;
                m_message = message;
                m_fileName = fileName;
                m_site = site;
            }
        }
        private class LogDataList : List<LogData>
        {
            public void Write(string path, DateTime time)
            {
                try
                {
                    bool errorOrGreater = false;
                    using (FileStream stream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
                    {
                        foreach (LogData data in this)
                        {
                            string text = time.ToString() + "  " + $"[{data.m_level.ToString()}]  " + data.m_message + System.Environment.NewLine;
                            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(text);
                            stream.Write(buffer, 0, buffer.Length);
                            stream.Flush();

                            if (data.m_level >= LogLevel.ERROR && !SubmitList.Contains(data.m_site))
                            {
                                SubmitList.Add(data.m_site);
                                errorOrGreater = true;
                            }
                        }
                    }
                }
                catch
                {
                }
            }
        }

        private AppLog()
        {
            Task.Factory.StartNew(Upate);
        }

        /// <summary>
        /// 启动日志扫描
        /// </summary>
        private void Upate()
        {
            while (true)
            {
                try
                {
                    System.Threading.Thread.Sleep(1000);
                    //载入数据
                    lock (outCacheList)
                    {
                        if (isClosed && outCacheList.Count == 0) break;
                        foreach (LogData data in outCacheList)
                        {
                            if (outCacheDic.ContainsKey(data.m_fileName))
                                outCacheDic[data.m_fileName].Add(data);
                            else
                            {
                                LogDataList list = new LogDataList();
                                list.Add(data);
                                outCacheDic.Add(data.m_fileName, list);
                            }
                        }
                        outCacheList.Clear();
                    }
                    if (outCacheDic.Count == 0)
                        continue;
                    DateTime time = DateTime.Now;
                    foreach (var item in outCacheDic)
                    {
                        string fileName = item.Key;
                        LogDataList list = item.Value;
                        string path = GetFilePath(time, fileName);
                        list.Write(path, time);
                    }
                    outCacheDic.Clear();
                }
                catch //(Exception)
                {
                    break;
                }
            }
            isEnd = true;
        }

        /// <summary>
        /// 添加日志
        /// </summary>
        /// <param name="data"></param>
        private void Add(LogData data)
        {
            if (isClosed) return;
            lock (outCacheList)
            {
                if (outCacheList.Count >= MaxCacheCount)
                    return;
                outCacheList.Add(data);
            }
        }

        /// <summary>
        /// 程序未捕获的异常
        /// </summary>
        /// <param name="exp"></param>
        public static void AddException(Exception exp, string fileName = "Log")
        {
            string msg = exp.Message + System.Environment.NewLine
                + exp.ToString() + System.Environment.NewLine;
            if (exp.InnerException != null)
            {
                msg += exp.InnerException.Message + System.Environment.NewLine
                    + exp.InnerException.TargetSite + System.Environment.NewLine;
            }
            Instance.Add(new LogData(LogLevel.WARN, msg, fileName));
        }
        public static void AddMsg(string message, string fileName = "Log")
        {
            AddFormat("", "", message, fileName);
        }
        public static void AddFormat(string targetSite, string message, string append = "", string fileName = "Log")
        {
            AddFormat(LogLevel.INFO, targetSite, message, append, fileName);
        }
        public static void AddFormat(string targetSite, Exception exp, string append = "", string fileName = "Log")
        {
            AddFormat(LogLevel.WARN, targetSite, exp.Message, append, fileName);
        }
        public static void AddFormat(LogLevel level, string targetSite, string message, string append = "", string fileName = "Log")
        {
            if (level < Level) return;
            string site = targetSite;
            if (!string.IsNullOrEmpty(targetSite))
                targetSite = $"[{targetSite}]";
            if (!string.IsNullOrEmpty(message))
                message = "    " + message;
            if (!string.IsNullOrEmpty(append))
                append = "    " + append;
            Instance.Add(new LogData(level, targetSite + message + append, fileName, site));
        }
        public static void AddFormat(LogLevel level, string targetSite, Exception exp, string append = "", string fileName = "Log")
        {
            AddFormat(level, targetSite, exp.Message, append, fileName);
        }

        public void WaitToEnd()
        {
            isClosed = true;
            while (!isEnd)
            {

            }
        }

        /// <summary>
        /// 清除多少天前的日志
        /// </summary>
        /// <param name="beforeDay"></param>
        public static void Clear(int beforeDay = 7)
        {
            string directory = LogDirectory;
            try
            {
                if (!System.IO.Directory.Exists(directory)) return;
                DateTime now = System.DateTime.Now;
                List<string> deletes = new List<string>();
                DirectoryInfo dinfo = new DirectoryInfo(directory);
                foreach (DirectoryInfo temp in dinfo.GetDirectories())
                {
                    try
                    {
                        string name = temp.Name;
                        string[] arr = name.Split('-');
                        DateTime dt = new DateTime(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]));
                        TimeSpan ts = now - dt;
                        if (ts.Days > beforeDay)
                            deletes.Add(temp.FullName);
                    }
                    catch
                    {
                        deletes.Add(temp.FullName);
                    }
                }
                foreach (string temp in deletes)
                    System.IO.Directory.Delete(temp, true);
            }
            catch
            {

            }
        }
    }

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: # WPF(Windows Presentation Foundation)技术 WPF是微软开发的一种桌面应用程序开发框架,它为Windows的GUI开发提供了一整套全新的、强大的标准开发工具。WPF突破了传统的窗体、控件开发方式,引入了基于XAML的声明式语法,强调了数据驱动、视觉化和交互式的设计方式。 WPF技术集成了多种技术,如XAML、CLR、WCF、LINQ等,使得可视化应用程序的开发变得更加简单和快速,同时WPF具备很强的扩展性和可定制性,方便开发者进行个性化的开发。 WPF提供的一些功能如下: 1. 丰富的控件库:WPF提供多种内置控件,同时支持自定义控件的开发。 2. 数据绑定:使用WPF可以很方便地实现控件与数据之间的绑定,同时支持多种数据源。WPF提供了很多数据绑定的方式,如简单绑定、多级绑定、命令绑定等等。 3. 视觉化效果:WPF提供了很多内置的特效库,如平移、变形、旋转、透明度等等,可以方便地实现丰富的UI效果。 4. 动画效果:WPF提供了很多内置的动画库,可以很容易地实现动态效果。 5. 多媒体支持:WPF支持多种多媒体格式,可以很方便地实现音频、视频的播放。 总之,WPF是一种强大、灵活、易用的技术,适合开发各种类型的桌面应用程序,包括ERP、CRM、OA、管理系统、多媒体应用、游戏等等。在未来,WPF将继续发展壮大,为开发者带来更多的便利和创新。 ### 回答2: WPF(Windows Presentation Foundation)是一种基于.NET框架和XAML语言的用户界面开发工具。它是微软推出的一种新型的高级用户界面技术,可以用来开发各种类型的Windows应用程序。WPF的主要特点包括可扩展性、动画效果、多媒体和3D支持、数据绑定等。 WPF与传统的WinForms相比,具有更强的可扩展性和灵活性。WPF采用基于XAML的声明式语法,可以更容易地实现界面和逻辑的分离。WPF也支持样式和模板,允许开发者对控件外观和行为进行个性化定制。同时,WPF中的布局机制和布局控件,也能够帮助开发者更方便地实现复杂的布局。 WPF还支持强大的动画效果,包括平移、旋转、缩放和渐变等多种动画效果。开发者可以使用动画来增强用户交互和视觉体验,提高应用的吸引力和交互性。 WPF还提供了强大的多媒体和3D支持,可以轻松地嵌入音频、视频和3D图形等各种多媒体元素。开发者可以利用WPF创建富有视觉效果和体验的应用程序,从而增加用户的满意度和忠诚度。 总之,WPF是一种强大的用户界面开发工具,可以帮助开发者快速构建出视觉效果、交互性和可扩展性都很高的Windows应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无熵~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值