我的Java記錄器(比如logback)如何找到我的代碼的行號?我的Java記錄器(如logback)如何找到我的代碼的行號?
這是高性能系統中包含文件行號的性能問題嗎?
它是否需要拋出一個異常並分析堆棧跟蹤來做到這一點,或者是否有另一個技巧呢?
感謝
我的Java記錄器(比如logback)如何找到我的代碼的行號?我的Java記錄器(如logback)如何找到我的代碼的行號?
這是高性能系統中包含文件行號的性能問題嗎?
它是否需要拋出一個異常並分析堆棧跟蹤來做到這一點,或者是否有另一個技巧呢?
感謝
行號被編譯成.class
文件,並讓他們比沒有這樣做,肯定更多的工作。
您可以通過Thread#getStackTrace()
獲得堆棧跟蹤而不會引發異常,但創建異常的成本大致相同(您不需要拋出並捕獲它)。
爲How Expensive is Thread.getStackTrace()?
提及,但過度砍伐獨自已經可以直接在系統大大放緩,收集的信息可以是相當昂貴。
這是高性能系統中包含文件行號的性能問題嗎?
您應該測試它。如果它不是沒有行號的性能問題,那很可能是沒有問題的。這一切都取決於你登錄的地點和頻率。
的documentation還提到行號
生成行號信息不是特別快。因此,應該避免使用它,除非執行速度不是問題。
我的Java記錄器(比如說logback)如何找到我的代碼的行號?
您可以自己閱讀代碼。它是availableonline in various places。
這是高性能系統中包含文件行號的性能問題嗎?
是的,如果你做了很多logger.log調用(或等價的)。 Log4j和Logback的文檔都會這樣說。
是否需要拋出一個異常並分析堆棧跟蹤來做到這一點,或者是否有另一個技巧呢?
我的理解是,這是應用程序代碼執行此操作的唯一實用方法。
(你可以假設重新使用現有的例外對象,然後調用fillInStackTrace()
每次你想捕捉的堆棧幀的時間。但是,性能優勢將是微乎其微的,尤其是當你已經處理了多線程問題。)