2014-03-26 27 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,因此係統可以在其他記錄器中重用。當然這隻有在需要時纔會實現:)

相關問題