当前位置: 首页 > news >正文

设计制造中国第一架飞机的人是南宁百度快速优化

设计制造中国第一架飞机的人是,南宁百度快速优化,动漫网站设计报告,网站做自适应的好处在软件开发过程中#xff0c;日志记录是一个不可或缺的功能。它不仅能帮助开发者调试程序#xff0c;还能在出现问题时提供重要的上下文信息。本文将介绍如何使用C#实现一个简单但功能完备的日志系统#xff0c;支持同时输出到文件和文本框#xff0c;并具备异步处理、级别…在软件开发过程中日志记录是一个不可或缺的功能。它不仅能帮助开发者调试程序还能在出现问题时提供重要的上下文信息。本文将介绍如何使用C#实现一个简单但功能完备的日志系统支持同时输出到文件和文本框并具备异步处理、级别过滤和颜色区分等实用特性。 一、功能概述 我们实现的SLog类具有以下特点 支持同时输出到文件和界面文本框异步处理日志几乎不影响程序性能支持不同日志级别Trace, Debug, Info, Warn, Error文件日志支持按日期自动分割界面日志支持不同级别显示不同颜色提供事件机制支持自定义日志处理线程安全支持多线程环境无第三方依赖 二、 核心实现 1. 日志级别定义 public enum LogLevel {Trace,Debug,Info,Warn,Error }我们定义了五种日志级别从最详细的Trace到最严重的Error满足不同场景的需求。 2. 异步处理机制 为了确保日志记录不会阻塞主线程我们采用了生产者-消费者模式 private readonly ConcurrentQueueLogItem _logQueue new ConcurrentQueueLogItem(); private readonly ManualResetEventSlim _logEvent new ManualResetEventSlim(false); private readonly CancellationTokenSource _cancellationTokenSource new CancellationTokenSource(); private Task _processingTask;public SLog() {_processingTask Task.Run(ProcessLogQueue, _cancellationTokenSource.Token); }当应用程序调用日志方法时日志项被放入并发队列然后通过ManualResetEventSlim通知后台处理线程。后台线程从队列中取出日志项并处理这样主线程可以继续执行而不被阻塞。 3. 文件日志实现 文件日志支持按日期自动分割通过文件路径中的日期占位符实现 private string GetFilePath(DateTime timestamp) {if (string.IsNullOrEmpty(File))return null;return File.Replace(yyyy, timestamp.Year.ToString(D4)).Replace(MM, timestamp.Month.ToString(D2)).Replace(dd, timestamp.Day.ToString(D2)); }当日志处理跨越午夜时系统会自动检测日期变化并切换到新的日志文件 // 检查是否需要创建新的日志文件 if (_fileWriter null || _currentFileDate ! timestamp.Date) {_currentFileDate timestamp.Date;_currentFilePath GetFilePath(timestamp);// ...创建新文件 }4. 界面日志与颜色支持 对于界面日志我们特别添加了颜色区分功能使不同级别的日志更加醒目 private void WriteToTextBox(string message, LogLevel level) {if (TextBox.InvokeRequired){TextBox.Invoke(new Actionstring, LogLevel(WriteToTextBox), message, level);return;}try{// 根据日志级别选择颜色Color color GetColorForLevel(level);// 处理不同类型的文本框if (TextBox is RichTextBox richTextBox){// 对于RichTextBox可以设置颜色richTextBox.SelectionStart richTextBox.TextLength;richTextBox.SelectionLength 0;richTextBox.SelectionColor color;richTextBox.AppendText(message Environment.NewLine);richTextBox.SelectionColor richTextBox.ForeColor;}else{// 对于普通TextBox只能使用默认颜色TextBox.AppendText(message Environment.NewLine);}TextBox.ScrollToCaret();}catch (Exception ex){// 错误处理} }默认颜色设置为 Trace: 灰色Debug: 蓝色Info: 黑色Warn: 橙色Error: 红色 5.6 事件机制 SLog类提供了事件机制允许外部订阅日志事件 public event EventHandlerLogEventArgs LogEvent;// 触发日志事件 LogEvent?.Invoke(this, new LogEventArgs(logItem.Timestamp,logItem.Level,logItem.Message,logItem.ProcessId,logItem.ThreadId));这样开发者可以轻松地将日志重定向到其他系统如数据库、网络或其他自定义存储。 三、使用示例 1. 基本用法 // 创建日志实例 var log new SLog {File logs/app_yyyyMMdd.log, // 支持日期格式TextBox richTextBox1, // 使用RichTextBox以支持颜色FileLogLevel LogLevel.Info, // 文件记录级别TextBoxLogLevel LogLevel.Debug // 界面记录级别 };// 记录不同级别的日志 log.Trace(这是一条跟踪日志); log.Debug(这是一条调试日志); log.Info(这是一条信息日志); log.Warn(这是一条警告日志); log.Error(这是一条错误日志);// 使用完成后释放资源 log.Dispose();2. 自定义颜色 // 自定义颜色 log.TraceTextBoxColor Color.DarkGray; log.DebugTextBoxColor Color.DarkBlue; log.InfoTextBoxColor Color.DarkGreen; log.WarnTextBoxColor Color.DarkOrange; log.ErrorTextBoxColor Color.DarkRed;3. 事件订阅 // 订阅日志事件 log.LogEvent (sender, e) {// 可以在这里处理自定义日志记录Console.WriteLine($Custom log: {e.Message} at {e.Timestamp}); };四、实现要点 线程安全使用ConcurrentQueue确保多线程环境下的安全性。资源管理实现IDisposable接口确保资源正确释放。异常处理对文件和界面操作进行异常捕获避免因日志错误影响主程序。性能优化异步处理和批量写入减少I/O操作次数。灵活性支持多种配置选项满足不同场景需求。 五、完整源码 using System; using System.Collections.Concurrent; using System.Diagnostics; using System.Drawing; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms;namespace Tools {public class SLog : IDisposable{#region 外部定义public enum LogLevel{Trace,Debug,Info,Warn,Error}public class LogEventArgs : EventArgs{public DateTime Timestamp { get; set; }public LogLevel Level { get; set; }public string Message { get; set; }public int ProcessId { get; set; }public int ThreadId { get; set; }public LogEventArgs(DateTime timestamp, LogLevel level, string message, int processId, int threadId){Timestamp timestamp;Level level;Message message;ProcessId processId;ThreadId threadId;}}#endregion#region 内部对象private readonly ConcurrentQueueLogItem _logQueue new ConcurrentQueueLogItem();private readonly ManualResetEventSlim _logEvent new ManualResetEventSlim(false);private readonly CancellationTokenSource _cancellationTokenSource new CancellationTokenSource();private Task _processingTask;private StreamWriter _fileWriter;private DateTime _currentFileDate;private string _currentFilePath;private bool _isDisposed;private readonly object _fileLock new object();// 默认颜色设置private static readonly Color TraceColor Color.Gray;private static readonly Color DebugColor Color.Blue;private static readonly Color InfoColor Color.Black;private static readonly Color WarnColor Color.Orange;private static readonly Color ErrorColor Color.Red;#endregion#region 外部对象public string File { get; set; }public TextBoxBase TextBox { get; set; }public LogLevel FileLogLevel { get; set; } LogLevel.Trace;public LogLevel TextBoxLogLevel { get; set; } LogLevel.Trace;public event EventHandlerLogEventArgs LogEvent;#endregion#region 外部函数public SLog(){_processingTask Task.Run(ProcessLogQueue, _cancellationTokenSource.Token);}public void Trace(string message) Log(LogLevel.Trace, message);public void Debug(string message) Log(LogLevel.Debug, message);public void Info(string message) Log(LogLevel.Info, message);public void Warn(string message) Log(LogLevel.Warn, message);public void Error(string message) Log(LogLevel.Error, message);#endregion#region 内部函数private void Log(LogLevel level, string message){var logItem new LogItem{Timestamp DateTime.Now,Level level,Message message,ProcessId Process.GetCurrentProcess().Id,ThreadId Thread.CurrentThread.ManagedThreadId};_logQueue.Enqueue(logItem);_logEvent.Set();}private void ProcessLogQueue(){// 写日志Action processLogItem () {while (_logQueue.TryDequeue(out var logItem)){ProcessLogItem(logItem);}};while (!_cancellationTokenSource.Token.IsCancellationRequested){_logEvent.Wait(_cancellationTokenSource.Token);_logEvent.Reset();processLogItem();while (_logQueue.TryDequeue(out var logItem)){ProcessLogItem(logItem);}}// 处理剩余日志项processLogItem();}private void ProcessLogItem(LogItem logItem){// 触发日志事件LogEvent?.Invoke(this, new LogEventArgs(logItem.Timestamp,logItem.Level,logItem.Message,logItem.ProcessId,logItem.ThreadId));// 格式化日志消息var logMessage FormatLogMessage(logItem);// 写入文件if (!string.IsNullOrEmpty(File) logItem.Level FileLogLevel){lock (_fileLock){WriteToFile(logMessage, logItem.Timestamp);}}// 写入文本框if (TextBox ! null logItem.Level TextBoxLogLevel){WriteToTextBox(logMessage, logItem.Level);}}private string FormatLogMessage(LogItem logItem){return $[{logItem.Timestamp:HH:mm:ss.ff}] [{logItem.Level}] [{logItem.ProcessId},{logItem.ThreadId}] {logItem.Message};}private void WriteToFile(string message, DateTime timestamp){try{// 检查是否需要创建新的日志文件if (_fileWriter null || _currentFileDate ! timestamp.Date){_currentFileDate timestamp.Date;_currentFilePath GetFilePath(timestamp);// 确保目录存在var directory System.IO.Path.GetDirectoryName(_currentFilePath);if (!string.IsNullOrEmpty(directory) !System.IO.Directory.Exists(directory)){System.IO.Directory.CreateDirectory(directory);}_fileWriter?.Close();_fileWriter new StreamWriter(_currentFilePath, true, Encoding.UTF8){AutoFlush true};}_fileWriter.WriteLine(message);}catch (Exception ex){// 日志写入失败时尝试输出到调试器Console.WriteLine($Failed to write log to file: {ex.Message});}}private string GetFilePath(DateTime timestamp){if (string.IsNullOrEmpty(File))return null;return File.Replace(yyyy, timestamp.Year.ToString(D4)).Replace(MM, timestamp.Month.ToString(D2)).Replace(dd, timestamp.Day.ToString(D2));}private void WriteToTextBox(string message, LogLevel level){if (TextBox.InvokeRequired){TextBox.Invoke(new Actionstring, LogLevel(WriteToTextBox), message, level);return;}try{// 根据日志级别选择颜色Color color GetColorForLevel(level);// 处理不同类型的文本框if (TextBox is RichTextBox richTextBox){// 对于RichTextBox可以设置颜色richTextBox.SelectionStart richTextBox.TextLength;richTextBox.SelectionLength 0;richTextBox.SelectionColor color;richTextBox.AppendText(message Environment.NewLine);richTextBox.SelectionColor richTextBox.ForeColor;}else{// 对于普通TextBox只能使用默认颜色TextBox.AppendText(message Environment.NewLine);}TextBox.ScrollToCaret();}catch (Exception ex){// 文本框写入失败时尝试输出到调试器Console.WriteLine($Failed to write log to textbox: {ex.Message});}}private Color GetColorForLevel(LogLevel level){switch (level){case LogLevel.Trace: return TraceColor;case LogLevel.Debug: return DebugColor;case LogLevel.Info: return InfoColor;case LogLevel.Warn: return WarnColor;case LogLevel.Error: return ErrorColor;default: return TextBox.ForeColor;}}public void Dispose(){if (_isDisposed) return;_isDisposed true;_cancellationTokenSource.Cancel();_logEvent.Set();try{_processingTask?.Wait(1000);}catch (AggregateException){// 任务取消时可能抛出异常可以忽略}_cancellationTokenSource.Dispose();_logEvent.Dispose();lock (_fileLock){_fileWriter?.Close();_fileWriter?.Dispose();}}private struct LogItem{public DateTime Timestamp { get; set; }public LogLevel Level { get; set; }public string Message { get; set; }public int ProcessId { get; set; }public int ThreadId { get; set; }}#endregion} }六、总结 本文介绍的SLog类是一个简单但功能完备的日志系统它结合了文件记录和界面显示的优势并提供了丰富的自定义选项。通过异步处理和级别过滤它在提供详细日志信息的同时几乎不影响应用程序的性能。颜色区分功能使得在界面中查看日志更加直观而事件机制则为扩展功能提供了可能。 这个实现不依赖任何第三方库可以直接集成到任何C#项目中特别是Windows Forms应用程序。开发者可以根据实际需求进一步扩展功能如添加日志文件大小限制、网络日志传输等。 希望这个简单的日志实现能为您的项目开发提供便利同时也欢迎根据实际需求进行修改和扩展。
http://www.zqtcl.cn/news/157272/

相关文章:

  • 淘宝联盟网站模板上海做企业网站
  • 繁体中文网站 怎么做wordpress禁止压缩图片
  • 怎么做图片网站百度云做.net网站
  • 长沙网上商城网站建设方案wordpress兼容mip
  • 横向网站模板上海 建筑
  • 手机wap网站程序上海网站制作库榆
  • 深圳网站建设 骏域网站建设推广软文范例大全500
  • 深圳广东网站建设套餐最近新闻事件
  • 电子商务网站建设与管理 pdf“设计网站”
  • 聊城wap网站建设清溪东莞网站建设
  • 书籍网站建设规划书app开发公司价格表
  • 小程序网站模板住建个人证书查询网
  • 西安 美院 网站建设贵阳美丽乡村建设网站
  • 平顶山市哪里有做网站的wordpress应用教程
  • 制作企业网站的实训报告医院网站设计模板
  • 要做网站照片怎么处理广东外发加工网
  • 做国际网站每年要多少钱厦门 外贸商城网站
  • 城乡建设学校官方网站程序外包网站
  • 深圳 网站设计师 招聘西数网站管理助手 伪静态
  • 广州网站备案要求国外工装设计网站大全
  • php+mysql 2012也买酒商城网站源码怎么用net123做网站
  • 西充移动网站建设如何设计一个简洁的logo
  • 济宁做网站自媒体新手入门
  • 重庆网站开发哪家专业网站布局图
  • 网站设计原则的历史网站开发 模块
  • 做企业网站收费自己的网站怎么做排名
  • 做网站网站软件开发经费预算
  • 优化网站图片网站图片布局
  • 有效的网站需要做到什么意思商业网站是什么
  • 网站设计开发网站用c 建网站时怎么做导航菜单栏