Log4j巧妙地提取日志打印的行号,最有可能通过使用Throwable通过查看其StackTrace来获取行号。
唉,Logger不是Log4j中的接口,所以不能只是用调试,信息,错误等方法对它进行另一个实现,然后可以根据平台的需要切换实现。
因此,如果创建一个包装器,即:
class Parent {
static final Logger log = Logger.getLogger(Parent.class);
static void debugLog(String str) {
log.debug(str);
}
static void debugLog(String str, Throwable t) {
log.debug(str, t);
}
}
如何让它将调用 debugLog() 的行号放入 log4j 记录器中,以便它按预期工作。 或者这只是 Log4j 中的一个可怕的设计缺陷。
您必须自己计算位置并构建LocationInfo
.然后,您必须创建一个LoggingEvent
并调用callAppenders
方法。