【发布时间】:2012-12-04 03:36:34
【问题描述】:
我正在尝试构建(用于学习目的)我自己的事件记录器;我对使用非 .net 框架而不是构建自己的框架不感兴趣,因为我这样做是为了更好地理解 .net。
我们的想法是拥有一个事件系统,我可以将其写入日志文件和/或在程序内部提取。为此,我创建了一个 LogEvent 类,该类将存储在 Queue<LogEvent> 中。
我计划在我的LogEvent 课程中使用以下字段:
private EventLogEntryType _eventType //enum: error, info, warning...
private string _eventMessage
private Exception _exception
private DateTime _eventTime
我不确定捕获导致事件被调用的对象的最佳方法。我想过只是做一个private Object _eventObject;,但我认为这不是线程安全的。
任何关于如何最好地存储调用事件的对象的建议都将不胜感激。我也愿意接受您可能提出的任何其他建议。
谢谢,托尼
【问题讨论】:
-
您想要存储调用事件的对象的原因是什么?如果您打算在对象上简单地使用
.ToString()来创建日志消息,则最好存储.ToString()值。 -
Keo 关注性能。随着主机应用程序的增长,您将开始每秒收集越来越多的消息。进行类型检查并不是确保事情按写入方式进行的最理想方式。在您的示例中,我仍将存储
string并在调用事件时使用myObject.CustomField.ToString()作为参数。 -
@AnthonyNichols - 我可以告诉你,当应用程序非常小的时候,我们就开始使用上述方法。当我们将记录器移到另一个程序集并最终移到另一个进程(一起在 IIS 之外)时,我们花了很多时间来摆脱 IIS 上下文和传递的此类异常对象等。
-
另外,如果你传递对象,并且它是一个 ref 类型,即不是不可变的,那么在你循环重用变量的情况下,你可以找到一个几乎不可能的错误,例如。
-
@AnthonyNichols - 我指的是实际对象。对不起,如果我不清楚。
标签: c# object logging system.diagnostics