2

我正在尝试构建(出于学习目的)我自己的事件记录器;我对使用非 .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;,但我认为这不是线程安全的。

任何关于如何最好地存储调用事件的对象的建议将不胜感激。我也愿意接受您可能提出的任何其他建议。

谢谢,托尼

4

1 回答 1

2

首先,自己写没有错。我们那里有一些很好的框架,但有时你会遇到一些奇怪的要求让你自己动手,反正我去过那里......
我认为你不应该使用短信。在几个项目中进行了这种类型的日志记录之后,我得出的结论是,最好的方法是拥有一组带有某种额外信息字段的事件类型(整数 ID)。你应该有一个LogEvetTypes看起来像这样的枚举:

public enum LogEventTypes
{
    //1xxx WS Errors
    ThisOrThatWebServiceError = 1001,

    //2xxx DB access error


    //etc...
}

根据我的经验,这将使您在尝试使用您记录的信息时更轻松。您还可以添加一个ExtraInformation字段以提供事件实例的特定信息。

至于导致事件的对象,我会使用类似typeof(YourClass).ToString();. 如果这是您创建的自定义类,您还可以实现一个ToString覆盖,该覆盖将在您的日志记录上下文中命名。

编辑:我在评论中添加了一些我写的细节,因为我认为它们很重要。通过 ref 将不可变的对象传递给服务方法通常不是一个好主意。您可能会在循环中重新分配相同的变量(例如)并创建一个几乎不可能找到的错误。另外,我建议现在做一些额外的工作,将日志基础设施与应用程序的实现细节分离,因为以后这样做会导致很多痛苦。我是根据我自己非常痛苦的经历这么说的。

于 2012-12-17T02:25:33.877 回答