C#开发高性能Log Help类设计开发的示例分析
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,本篇文章给大家分享的是有关C#开发高性能Log Help类设计开发的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。概述项目中要在
千家信息网最后更新 2026年11月04日C#开发高性能Log Help类设计开发的示例分析
本篇文章给大家分享的是有关C#开发高性能Log Help类设计开发的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
概述
项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多。
设计思想
在写入日志时利用Queue来管理,写日志有一个专门的backgroud线程来处理,如果没有日志要写,这个线程处于wait状态,这就有了线程的异步处理。
简单的实现方式
////Write Log // public static void WriteLog(string logFile, string msg) { try { System.IO.StreamWriter sw = System.IO.File.AppendText( logPath + LogFilePrefix +" "+ logFile + " " + DateTime.Now.ToString("yyyyMMdd") + ".Log" ); sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss: ") + msg); sw.Close(); } catch (Exception) { throw; } }
我们的设计图
而后我们在AddLogMessage时semaphore.Release()就能唤醒wait中的log 线程。
代码设计
////// Author: spring yang /// Create time:2012/3/30 /// Log Help class /// ///High performance log class public class Log : IDisposable { //Log Message queue private static Queue_logMessages; //log save directory private static string _logDirectory; //log write file state private static bool _state; //log type private static LogType _logType; //log life time sign private static DateTime _timeSign; //log file stream writer private static StreamWriter _writer; /// /// Wait enqueue wirte log message semaphore will release /// private Semaphore _semaphore; ////// Single instance /// private static Log _log; ////// Gets a single instance /// public static Log LogInstance { get { return _log ?? (_log = new Log()); } } private object _lockObjeck; ////// Initialize Log instance /// private void Initialize() { if (_logMessages == null) { _state = true; string logPath = System.Configuration.ConfigurationManager.AppSettings["LogDirectory"]; _logDirectory = string.IsNullOrEmpty(logPath) ? ".\\log\\" : logPath; if (!Directory.Exists(_logDirectory)) Directory.CreateDirectory(_logDirectory); _logType = LogType.Daily; _lockObjeck=new object(); _semaphore = new Semaphore(0, int.MaxValue, Constants.LogSemaphoreName); _logMessages = new Queue(); var thread = new Thread(Work) {IsBackground = true}; thread.Start(); } } /// /// Create a log instance /// private Log() { Initialize(); } ////// Log save name type,default is daily /// public LogType LogType { get { return _logType; } set { _logType = value; } } ////// Write Log file work method /// private void Work() { while (true) { //Determine log queue have record need wirte if (_logMessages.Count > 0) { FileWriteMessage(); } else if (WaitLogMessage()) break; } } ////// Write message to log file /// private void FileWriteMessage() { LogMessage logMessage=null; lock (_lockObjeck) { if(_logMessages.Count>0) logMessage = _logMessages.Dequeue(); } if (logMessage != null) { FileWrite(logMessage); } } ////// The thread wait a log message /// ///is close or not private bool WaitLogMessage() { //determine log life time is true or false if (_state) { WaitHandle.WaitAny(new WaitHandle[] { _semaphore }, -1, false); return false; } FileClose(); return true; } ////// Gets file name by log type /// ///log file name private string GetFilename() { DateTime now = DateTime.Now; string format = ""; switch (_logType) { case LogType.Daily: _timeSign = new DateTime(now.Year, now.Month, now.Day); _timeSign = _timeSign.AddDays(1); format = "yyyyMMdd'.log'"; break; case LogType.Weekly: _timeSign = new DateTime(now.Year, now.Month, now.Day); _timeSign = _timeSign.AddDays(7); format = "yyyyMMdd'.log'"; break; case LogType.Monthly: _timeSign = new DateTime(now.Year, now.Month, 1); _timeSign = _timeSign.AddMonths(1); format = "yyyyMM'.log'"; break; case LogType.Annually: _timeSign = new DateTime(now.Year, 1, 1); _timeSign = _timeSign.AddYears(1); format = "yyyy'.log'"; break; } return now.ToString(format); } ////// Write log file message /// /// private void FileWrite(LogMessage msg) { try { if (_writer == null) { FileOpen(); } else { //determine the log file is time sign if (DateTime.Now >= _timeSign) { FileClose(); FileOpen(); } _writer.WriteLine(Constants.LogMessageTime+msg.Datetime); _writer.WriteLine(Constants.LogMessageType+msg.Type); _writer.WriteLine(Constants.LogMessageContent+msg.Text); _writer.Flush(); } } catch (Exception e) { Console.Out.Write(e); } } ////// Open log file write log message /// private void FileOpen() { _writer = new StreamWriter(Path.Combine(_logDirectory, GetFilename()), true, Encoding.UTF8); } ////// Close log file /// private void FileClose() { if (_writer != null) { _writer.Flush(); _writer.Close(); _writer.Dispose(); _writer = null; } } ////// Enqueue a new log message and release a semaphore /// /// Log message public void Write(LogMessage msg) { if (msg != null) { lock (_lockObjeck) { _logMessages.Enqueue(msg); _semaphore.Release(); } } } ////// Write message by message content and type /// /// log message /// message type public void Write(string text, MessageType type) { Write(new LogMessage(text, type)); } ////// Write Message by datetime and message content and type /// /// datetime /// message content /// message type public void Write(DateTime dateTime, string text, MessageType type) { Write(new LogMessage(dateTime, text, type)); } ////// Write message ty exception and message type /// /// exception /// message type public void Write(Exception e, MessageType type) { Write(new LogMessage(e.Message, type)); } #region IDisposable member ////// Dispose log /// public void Dispose() { _state = false; } #endregion } ////// Log Type /// ///Create log by daily or weekly or monthly or annually public enum LogType { ////// Create log by daily /// Daily, ////// Create log by weekly /// Weekly, ////// Create log by monthly /// Monthly, ////// Create log by annually /// Annually } ////// Log Message Class /// public class LogMessage { ////// Create Log message instance /// public LogMessage() : this("", MessageType.Unknown) { } ////// Crete log message by message content and message type /// /// message content /// message type public LogMessage(string text, MessageType messageType) : this(DateTime.Now, text, messageType) { } ////// Create log message by datetime and message content and message type /// /// date time /// message content /// message type public LogMessage(DateTime dateTime, string text, MessageType messageType) { Datetime = dateTime; Type = messageType; Text = text; } ////// Gets or sets datetime /// public DateTime Datetime { get; set; } ////// Gets or sets message content /// public string Text { get; set; } ////// Gets or sets message type /// public MessageType Type { get; set; } ////// Get Message to string /// ///public new string ToString() { return Datetime.ToString(CultureInfo.InvariantCulture) + "\t" + Text + "\n"; } } /// /// Log Message Type enum /// public enum MessageType { ////// unknown type /// Unknown, ////// information type /// Information, ////// warning type /// Warning, ////// error type /// Error, ////// success type /// Success }
Test Case:
public static void TestLog() { Log.LogInstance.Write( "Test Message",MessageType.Information); Log.LogInstance.Write("one",MessageType.Error); Log.LogInstance.Write("two", MessageType.Success); Log.LogInstance.Write("three", MessageType.Warning); }运行结果:
接受Mainz的建议,改了部分代码。
以上就是C#开发高性能Log Help类设计开发的示例分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
设计
开发
日志
线程
处理
示例
设计开发
高性能
C#
分析
代码
更多
知识
篇文章
部分
实用
商业
就是
尽可能
工作会
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网金融科技
浩特互联网科技
腾讯科技 互联网女皇
互联网科技logo设计
伴你行互联网科技有限公司
苏州大垚互联网科技
互联网科技公司名称
左右互联网络科技
卓越科技互联网 招聘
科技与互联网哪个更好
互联网与医疗科技
民营互联网公司国防科技
燊美集互联网科技有限公司
互联网时代的科技公司
深圳互联网科技的发展
湖北辰鑫科技互联网
互联网科技手抄报图片
数字互联网科技有限公司
科技互联网专业务虚会材料
现代科技的标志之一的互联网
互联网科技股
互联网科技英文
远拓互联网科技
互联网科技缩写
电子科技大学互联网
互联网系的金融科技公司
互联网科技产业特征
乌鲁木齐新华智原互联网科技学校
马化腾互联网科技教学
中国主要互联网科技公司