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