2014-03-26 32 views
2

最近有一位同事让我对我们的一些日志做一些改进,因为日志并没有给他提供有意义的信息,所以他无法弄清楚问题。为了记录的目的,我应该重写ToString吗?

我认为的第一件事是直接在Debug调用中打印更多关于对象的信息String.Format(我们现在使用的是log4net)。我立即改变了这种思路,只在模型和日志上实现了ToString方法,因为我可以在代码中的多个位置记录同一个类,并且只想在一个位置实现格式化。

最后,这是当前的解决方案:我在违规类和子类上实现了ToString,并开始记录类本身。

虽然想了一下,但我想知道这是否是正确的方法,或者是否有另一种更优雅/正确的方法。

我发现了一些关于此事的帖子,如this one,但没有足够的结论。我甚至想知道使用DebuggerDisplayAttribute是不是一个体面的做法:它用于调试目的,如日志记录。 Log4net也支持被称为ObjectRenders that can be used for such purposes,但我觉得这有点奇怪,非常特定于log4net。

我觉得这个问题很广泛,包含了所有面向对象的语言,但是我的具体情况是.Net。在记录和使用方法方面是否有最佳的最佳做法?

+1

Imho使用'ToString'来记录或调试目的很好。它使你的生活变得更加简单。 –

回答

1

这里唯一重要的问题是:有没有其他的环境可以访问ToString()?例如,它是否曾经直接在数据绑定在UI上?如果不是,那么ToString()可能就好了,假设对象完全是你的,并且不是你公开给外部调用者(他们可以以不同的方式使用它)的库的一部分。没有必要介绍自定义调试器显示和自定义对象渲染的复杂性,除非那些实际解决了无法以更简单和更直接的方式解决的问题。

+0

所讨论的对象是一个确实可能暴露给其他团队的模型。我们将它们用作某些服务的参数,所以其他一些程序集可以通过它的接口调用服务(我们使用WCF),并且它们需要模型集合。 “ToString”方法只是公开的事实已经让我对潜在的陷阱保持警惕。 – julealgon

+0

@juleagon有一个小小的风险,它会成为合约的一个隐含部分 - 他们依靠它来进行平等/唯一性/排序。可以说这是他们的错误不是你的错误。但是你必须决定这是多么重要。 –

1

我会远离ToString();即使它是一种记录定制信息的低礼仪方式,它也会将呈现问题添加到一个对象中,这些问题将被日志记录消耗掉。由于日志记录是一个与对象存在的系统完全分离的系统,因此您要为已有对象添加责任。提示SRP小提琴

从你的问题你谈论的两个类需要更多的信息;我认为在这种情况下使用String.Format就足够了。这种方法与ToString方法一样简单快捷,因为它不会暴露给其他消费者,所以危险性较小。

如果更多的类需要根据对象类型记录自定义信息,那么可能需要专门的机制。例如IInformationExtractorFor<T>接口,用于要在自定义appender中解析的要记录的类;接口和类不会绑定到log4net,因此系统可以在其他记录器中重用。当然这只有在需要时才会实现:)

相关问题