【发布时间】:2009-08-28 10:39:03
【问题描述】:
我基本上想编写一个客户记录器/跟踪器,它还记录调用记录器/跟踪器的方法的类和方法名称。这应该很快,这样它就不会影响应用程序的性能,强类型和干净。有没有人有好的想法?
以下是我拥有的几个,但我担心由于反射而导致的性能:
StackTrace/StackFrame(开销太大?)
MethodInfo.GetCurrentMethod()(还是太慢了?而且不是很干净)
将方法作为委托传递(C# 可以隐式地做到这一点,我可以访问 MethodInfo,但不是很干净)
我感谢任何人的 cmets。
更新:
我喜欢 StackFrame 的整洁,所以我问了一个更具体的问题 here 关于 StackFrame 的性能,我得到了一些非常好的回应,包括性能测试。事实证明,MethodInfo.GetCurrentMethod() 是最快的(在我的计算机上大约需要 1 微秒),new StackFrame(1) 可以按需请求(在我的计算机上大约需要 15-20 微秒)。我把方法作为委托选项扔掉了,因为当方法有多个参数时它太乱了。
结论:
我已经查看了所有选项,最好的方法是为 PostSharp 编写一个自定义插件,该插件在编译期间将方法名称作为字符串注入 MSIL 中,并在其中应用 [Trace] 之类的自定义属性。在我看来,这是最快和最可维护的选择。这甚至可以实现更多的事情,比如在没有任何反射的情况下传递参数名称和参数,以及自动捕获和记录异常。此my related question 了解更多信息。
【问题讨论】:
-
请问,你为什么不想使用log4net?
-
我不喜欢太依赖其他组件。而且在 log4net 的情况下,它也太复杂了。
-
Hermann,这在我们的行业中通常被称为“非此处发明综合症”,最好避免。这是一个维基百科链接,其中包含有关这种痛苦的更多信息:en.wikipedia.org/wiki/Not_Invented_Here
-
Joel Spolsky 的公司还发明了他们自己的编程语言。我不确定这是一个很好的例子。你真的应该考虑使用书面库。日志记录是一个已解决的问题,我认为重新发明轮子可能不是您时间的最佳利用方式。只是我的 2 美分...花它的价值。
-
另外,您会注意到他的论点是,如果这是您业务的核心,您应该这样做。如果您的企业正在进行日志记录(例如,如果您的公司名称是“We Log Good, Inc.”),我会说去吧。
标签: c# .net reflection logging