2017-04-06 23 views
3

我正在尋找將請求和響應記錄到Web服務。我正在使用帶有基礎log4j2實現的slf4j。我的記錄器語句如下所示。slf4j-log4j將對象轉換爲字符串,然後傳遞給Asynchronus記錄器

LOGGER.info( 「{}」,新CustomObject(請求,響應的param1,param2的));

我已經在所有必要的對象和CustomObject類中實現了toString方法來記錄該對象的所有屬性。

我看到,它通過將日誌消息發送到所述非同步記錄器前的CustomObject的toString方法被調用。

反正是有,自定義對象的序列化/ toString方法調用被推遲,當實際記錄發生的時間?

+0

我的答案可以接受/有用嗎? –

回答

3

這是設計的:如果一個對象被記錄有可能之前在後臺線程可以登錄它,它是突變的,你最終會想什麼不同的日誌條目。

在您的示例應用程序不抱到CustomObject的引用,所以它不能改變,但Log4j2不能知道,所以它會採取保守的做法。

有一個system property來關掉這個功能,但是使用它意味着所有對象記錄必須是有效不可變的,否則你會發現你的日誌騙你...(我也是不能100%確認系統屬性仍然有效,因爲Log4j2成爲免費版本2.6垃圾)

更新(2017年12月9日):該系統屬性仍然工作在崗位2.6版本。 (但我不建議在後臺線程中呈現消息,除非您非常確信應用程序不會修改記錄的對象。)

+0

這工作,謝謝!將此log4j.format.msg.async設置爲true後,toString方法未被調用。確實,對象屬性(如果從主線程中更改的話)會從日誌記錄中拋棄。但是,對於我的用例,這是有效的。 –

+0

如果答案是有用的,你能接受和/或upvote嗎? –

+0

想補充一點,如果系統有其他記錄器定義,它也適用於那些記錄器。在那個時候,我們必須小心記錄可變對象。 –