簡體   English   中英

如何使用Java在日志文件中編寫調用者位置信息,而不會影響性能?

[英]How to write caller location information in a log file using Java, without hurting performance?

如何使用Java和log4j在日志文件中編寫調用者位置信息(Java源文件和行),但不會影響性能? log4j允許您在日志文件中寫入此類信息,但它使用堆棧跟蹤來獲取該信息,每次發出日志語句時,都會導致性能下降。 我正在尋找一個性能友好的替代方案,比如在編譯時獲取位置信息而不是在運行時。 可以使用注釋來實現這一目標嗎? 或者其他一些技巧?

如何讓它成為構建過程的一部分來替換某些占位符,例如此片段中的$filename$$linenumber$

logger.info("The original message... $filename$ $linenumber$");

要替換文件名,可以使用修訂控制系統替換關鍵字。 免責聲明:這只是我的頭腦,我從未嘗試過。

我同意Rob的意見,認為這通常是不必要的。 通常在日志消息中有一些不同的字符串,搜索它會到達源。 有了一個好的IDE,這真的很快。

現在,考慮到問題,這是一個可能的解決方案:

Class Foo
    void bar()
        new Logger(){} . warn("blah");

對於運行時的每個日志操作,都會創建一個新對象 - 這不是問題。

對於包含此類日志語句的每行源,將創建一個新類。 這可能太多了。

魔法是如何運作的:

abstract public class Logger
    static Map<Class, String> sourceInfo = new ...
    public Logger()
        Class thisClass = this.getClass();
        String info = sourceInfo.get(thisClass);
        if(info==null)
             info = ... // init from stack trace
             sourceInfo.put(thisClass,info)
        this.info = info

     public void warn(msg)
        log(WARN, this.info,msg)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM