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

标签 c# object logging system.diagnostics

我正在尝试构建(出于学习目的)我自己的事件记录器;我对使用非 .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/

相关文章:

c# - Opengl - "fullscreen"纹理渲染性能问题

java - 用新对象更新 ArrayList+删除旧对象

apache - 阻止(停止)Apache 记录特定的 AJAX/XmlHttpRequest?

java - 如何解耦日志实现和API?

JavaScript ES6 将嵌套分隔字符串解析为键/值

python - 如何在 ipython session 中完全重置 Python stdlib 日志记录模块?

c# - if 语句中的变量声明

c# - 将\u2265 插入 C# 字符串

c# - GridView 按代码隐藏列

c# - 传递一个对象,继承它或使用直接方法