C#自定义记录器-捕获发送对象的最佳方式

C#自定义记录器-捕获发送对象的最佳方式,c#,object,logging,system.diagnostics,C#,Object,Logging,System.diagnostics,我正在尝试构建(出于学习目的)自己的事件记录器;我对使用非.net框架而不是构建自己的框架不感兴趣,因为我这样做是为了更好地理解.net 其想法是拥有一个事件系统,我可以将其写入日志文件和/或在程序内部从中提取。为此,我创建了一个LogEvent类,该类将存储在队列中 我计划在我的LogEvent课程中使用以下字段: private EventLogEntryType _eventType //enum: error, info, warning... private string _event

我正在尝试构建(出于学习目的)自己的事件记录器;我对使用非.net框架而不是构建自己的框架不感兴趣,因为我这样做是为了更好地理解.net

其想法是拥有一个事件系统,我可以将其写入日志文件和/或在程序内部从中提取。为此,我创建了一个
LogEvent
类,该类将存储在
队列中

我计划在我的
LogEvent
课程中使用以下字段:

private EventLogEntryType _eventType //enum: error, info, warning...
private string _eventMessage
private Exception _exception
private DateTime _eventTime
我不确定的是捕获导致调用事件的对象的最佳方法。我想做一个
私有对象\u eventObject
任何关于如何最好地存储调用事件的对象的建议都将不胜感激。我也愿意接受你可能提出的任何其他建议


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

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

    //2xxx DB access error


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

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


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

你想要存储称为事件的对象的原因是什么?如果要在对象上简单地使用
.ToString()
来创建日志消息,最好存储
.ToString()
值。注意性能。随着主机应用程序的增长,您将开始每秒收集越来越多的消息。进行类型检查并不是确保事情按编写方式进行的最理想的方法。在您的示例中,我仍然会存储一个
字符串
,并且在调用事件时使用
myObject.CustomField.ToString()
作为参数。@AnthonyNichols-我可以告诉您,在应用程序非常小的时候,我们开始使用上述方法。当我们将记录器移动到另一个程序集并最终移动到另一个进程(在IIS之外)时,我们花了很多时间来摆脱IIS上下文和这样的异常对象传递,等等。此外,如果您传递对象,并且它是一个ref类型,即不是不可变的,您可能会使bug几乎无法找到,例如,在循环中重用变量的情况下。@AnthonyNichols-I引用的是实际对象。如果我不清楚,很抱歉。要扩展@elad lachmi的
ToString
override。如果您正在滚动所有自己的类,则可以使用
.LogInfo()
方法创建一个iLoginInformation接口。@Jastill-这是真的,但在我的项目中不是一个选项。如果您从头开始构建所有对象,那么您完全可以让它们实现某种日志记录界面。我喜欢使用.LogInfo()的想法,但我也可能希望将其用于其他项目或不包含该代码的对象。我的想法是使用一个Try/Catch语句,有没有更好的方法?也许扩展方法可以支持您无法更改的对象。@EladLachmi@贾斯蒂尔-谢谢你的帮助!