2011-09-02 89 views
3

我目前正在爲一些網絡監控工具的Java應用程序工作。在我的代碼中,我應該使用很多日誌記錄。由於它是網絡管理軟件,日誌中的信息對用戶非常有用,因此必須使用它們。但是現在我對我更喜歡什麼樣的記錄器方法感到困惑。現在我使用Logger.lop(...//...),因爲在它的幫助下,我們還記錄了類名和方法,因此對於我(開發人員)來說,調試代碼和發現錯誤變得非常容易。但最後我很困惑,我應該用相同的日誌機制把它交付給最終用戶嗎?讓用戶知道當前正在執行什麼樣的類,在哪種方法中發生錯誤是否有害。我在很多產品中看過很多次異常處理stacktrace,因此通常我們也會使用類名稱。那麼讓enduser知道你的類名和方法是什麼沒有問題?可以在java產品中記錄源類名稱和方法名稱嗎?

+0

@所有它可能會看到一個理論上的問題,但仍然不是邏輯 – amod

回答

6

在考慮安全性影響之前,請考慮性能。在大多數日誌記錄系統中,日誌記錄工具動態獲取實際的類名和方法名稱需要反射,並大大減緩日誌記錄 - 通常是同步操作。我的猜測是,在網絡監控應用程序中,你真的不希望這樣。

如果您將方法名稱硬編碼到日誌消息中(通過使其成爲消息或類別的一部分),這是一個不同的故事。作爲一名安全人員,我認爲這不是什麼大不了的事情 - 如果你的代碼是用Java編寫的,那麼它可以顛倒過來,所以你的代碼的運行方式應該是安全的,即使代碼被送走了。

所有這一切,你可以使用不同的日誌配置進行開發和生產,或者那些細粒度的消息可以進行調試,跟蹤等。如果你使用log4j,通常建議使用isDebugEnabled以包含任何動態計算的日誌語句 - 這些日誌語句是在日誌語句確定是否啓用之前計算得出的。

+0

似乎Log4j確實使用了反射...但Logback(默認的SLF4J實現)?我相信,在JDK 1.5+中,您可以調用Thread.getStackTrace()來獲取堆棧跟蹤元素,並從頂層元素中獲取方法名稱 - 而無需反射。看起來像一個體面的伐木系統將使用該設施。 –

7

log4j/logback/slf4j允許您爲不同的appender使用不同的格式。對於開發,您可以啓用一個控制檯appender,其中包含類名稱的格式,而對於最終用戶,您可以忽略它(對於文件appender)

+0

我不能使用任何其他pakage我只使用記錄器在我想記錄日誌文件中的消息的地方。所以主要問題是在日誌文件中顯示類名是否正確? – amod

+3

問問你的用戶。對我來說還好。 – Bozho

1

值得一提的是,這種日誌記錄在Java中的性能成本很高,與通常使用預處理器實現的C++相反。幸運的是,使用log4j/logback,您可以按照Bozho的建議開啓和關閉—。

相關問題