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