如何使用Java在日志文件中编写调用者位置信息,而不会影响性能?

时间:2010-08-27 20:48:50

标签: java performance logging log4j

如何使用Java和log4j在日志文件中编写调用者位置信息(Java源文件和行),但不会影响性能? log4j允许您在日志文件中写入此类信息,但它使用堆栈跟踪来获取该信息,每次发出日志语句时,都会导致性能下降。 我正在寻找一个性能友好的替代方案,比如在编译时获取位置信息而不是在运行时。可以使用注释来实现这一目标吗?或者其他一些技术?

2 个答案:

答案 0 :(得分:1)

如何让它成为构建过程的一部分,以替换某些占位符,例如此代码段中的$filename$$linenumber$

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

要替换文件名,可以使用修订控制系统替换关键字。免责声明:这只是我的头脑,我从未尝试过。

答案 1 :(得分:0)

我同意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)