C#开发高性能Log Help类设计开发的示例分析
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,本篇文章给大家分享的是有关C#开发高性能Log Help类设计开发的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。概述项目中要在
千家信息网最后更新 2025年02月23日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安全错误
数据库的锁怎样保障安全
畅连服务器
天门高级戴尔服务器
数据库为何会用到显卡
linux服务器管理书籍
服务器管理都管理什么
甘肃政法大学数据库补考
医院网络安全管理
魔兽世界数据库装备查询器
一个数据库2个实例
江西绿色软件开发
湖北安卓软件开发费用
数据库系统统计界面
青白江满满网络技术工作室
厦门美能网网络技术有限公司
烟台荏原软件开发
二维码怎么关联到数据库
sql数据库物理恢复
数据库原理及应用考试题
深圳越凡网络技术
包头精益管理软件开发
湖南省学it软件开发薪资
云服务器怕别人租用诈骗吗
来电骚扰拦截数据库
蓝凌ekp使用什么数据库
软件开发选mac
系统管理软件开发
数据库安全考试题库
西安网络安全测评
远程桌面连接服务器显示程序运行
做软件开发成本怎么算