我正在尝试构建(用于学习目的)我自己的事件记录器;我对听到使用非.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;
,但我认为这不是线程安全的或安全的。
有关如何最好地存储调用该事件的对象的任何建议将不胜感激。我也对你可能提出的任何其他建议持开放态度。
谢谢,Tony
答案 0 :(得分:2)
首先,写自己没有错。我们在那里有一些很好的框架,但是有时你达到了一些奇怪的要求让你自己滚动的地步,无论如何我一直在那里......
我不认为你应该使用短信。在几个项目中进行这种类型的日志记录之后,我得出的结论是,最好的方法是使用一组具有某种类型的额外信息字段的事件类型(整数ID)。
你应该有一个LogEvetTypes
的枚举,看起来像这样:
public enum LogEventTypes
{
//1xxx WS Errors
ThisOrThatWebServiceError = 1001,
//2xxx DB access error
//etc...
}
根据我的经验,这将使您在尝试使用您记录的信息时更轻松。您还可以添加ExtraInformation
字段,以便提供特定于事件实例的信息。
至于引起事件的对象,我会使用像typeof(YourClass).ToString();
这样的东西。如果这是您创建的自定义类,您还可以实现ToString
覆盖,它将在您的日志记录上下文中命名。
编辑:我在评论中添加了一些我写的细节,因为我认为它们非常重要。通过引用服务方法传递非永久不变的对象通常不是一个好主意。您可以在循环中重新分配相同的变量(例如)并创建几乎不可能找到的错误。此外,我建议现在做一些额外的工作来将日志记录基础结构与应用程序的实现细节分离,因为稍后这样做会导致很多痛苦。我是根据自己非常痛苦的经历说的。